¿Escribir sugerencia para un archivo o un objeto similar a un archivo?

2 minutos de lectura

avatar de usuario
marca amery

¿Hay alguna sugerencia de tipo correcta para usar para un archivo u objeto similar a un archivo en Python? Por ejemplo, ¿cómo tipearía el valor de retorno de esta función?

def foo() -> ???:
    return open('bar')

avatar de usuario
Wayne Werner

Usa el typing.TextIO o typing.BinaryIO tipos, para archivos abiertos en modo texto o modo binario respectivamente.

De los documentos:

clase typing.IO

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

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

  • Genéricamente, ¿quizás escribiendo.IO como descripción del tipo?

    –Yongwei Wu

    11 de mayo de 2017 a las 10:56

  • 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.

    usuario2124834

    24 de junio de 2017 a las 10:04


  • Se reprodujo el problema de @Marein en la comunidad PyCharm 2017.2: i.imgur.com/Ai4sVQl.jpg

    – Jean-François Corbett

    07/12/2017 a las 20:27

  • La documentación es un poco confusa, indica una desaprobación, pero no estoy completamente seguro de lo que cubre, la interpretación optimista de que solo se trata del espacio de nombres escribiendo.io, pero no estoy interesado en ser demasiado optimista al programar .

    – T-shirtman

    16 de junio de 2021 a las 16:42

  • @Tshirtman Creo que puedes ser optimista al respecto. encontré este problema con respecto a la desaprobación y parece ser más claro acerca de typing.io siendo el espacio de nombres en desuso porque typing.io.BinaryIO y otros también existen y fueron utilizados en su mayoría directamente desde el typing espacio de nombres, por ejemplo, typing.BinaryIO.

    – mxmlnkn

    30 de junio de 2021 a las 18:57

avatar de usuario
Carlos Merriam

La respuesta corta:

  • Tienes que ser explícito. Eso es from typing import TextIO No solo from typing import *.
  • Usar IO para referirse a un archivo sin especificar de qué tipo
  • Usar TextIO o BinaryIO si sabes 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

  • puedes hacer un open sin especificar un archivo para abrir?

    – Jean-François T.

    7 de julio a las 4:42


¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad