¿Escriba una sugerencia para un archivo o un objeto similar a un archivo?


106

¿Hay alguna sugerencia de tipo correcto para usar para un archivo o un objeto similar a un archivo en Python? Por ejemplo, ¿cómo escribiría-insinuaría el valor de retorno de esta función?

def foo():
    return open('bar')

Respuestas:


146

Utilice los tipos typing.TextIOo typing.BinaryIO, para archivos abiertos en modo texto o en modo binario, respectivamente.

De los documentos :

clase typing.IO

Espacio de nombres de contenedor para tipos de flujo de E / S.

Esto define el tipo genérico IO[AnyStr]y los alias TextIOy BinaryIOpara respectivamente IO[str]y IO[bytes]. Estos representan los tipos de flujos de E / S como los devueltos por open().


Genéricamente, ¿tal vez escribiendo .IO como descripción del tipo?
Yongwei Wu

2
Ninguno de estos parece funcionar para mí: def f() -> IO: return open('test')da "Tipo esperado 'IO', obtuvo 'TextIOWrapper [str]' en su lugar" en PyCharm.

@Marein ¿qué pasa IO[str]?
Wayne Werner

Lo mismo me temo. También estoy notando que iterar sobre las líneas en un archivo da "Colecciones esperadas.

1
Reproducido el número de @ Marein en la comunidad PyCharm 2017.2: i.imgur.com/Ai4sVQl.jpg
Jean-François Corbett

11

La respuesta corta:

  • Debes ser explícito. Eso from typing import TextIOno es justo from typing import *.
  • Use IOpara referirse a un archivo sin especificar de qué tipo
  • Use TextIOo BinaryIOsi conoce el tipo
  • Actualmente no puede especificar que se abra para escritura o su codificación.

Como ejemplo:

from typing import BinaryIO

def binf(inf: BinaryIO):
    pass

with open('x') as f:
    binf(f)

da un error de inspección (en PyCharm) de Expected type 'BinaryIO', got 'TextIO' instead

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.