Para 3.1+, uno de los siguientes:
isinstance(something, io.TextIOBase)
isinstance(something, io.BufferedIOBase)
isinstance(something, io.RawIOBase)
isinstance(something, io.IOBase)
Para 2.x, "objeto similar a un archivo" es una cosa demasiado vaga para verificar, pero la documentación de cualquier función con la que esté tratando le dirá lo que realmente necesita; si no, lea el código.
Como señalan otras respuestas, lo primero que debe preguntar es qué es exactamente lo que está buscando. Por lo general, EAFP es suficiente y más idiomático.
El glosario dice que "objeto de archivo" es sinónimo de "objeto de archivo", lo que en última instancia significa que es una instancia de una de las tres clases base abstractas definidas en el io
módulo , que son todas subclases de IOBase
. Entonces, la forma de verificar es exactamente como se muestra arriba.
(Sin embargo, la verificación IOBase
no es muy útil. ¿Se imagina un caso en el que necesite distinguir un archivo real similar read(size)
a una función de un solo argumento read
que no sea similar a un archivo, sin necesidad de distinguir también entre archivos de texto y archivos sin formato? ¿archivos binarios? Entonces, realmente, casi siempre desea verificar, por ejemplo, "es un objeto de archivo de texto", no "es un objeto similar a un archivo".)
Para 2.x, aunque el io
módulo ha existido desde 2.6+, los objetos de archivo integrados no son instancias de io
clases, tampoco lo son ninguno de los objetos similares a archivos en stdlib, ni tampoco la mayoría de los objetos similares a archivos de terceros que usted es probable que encuentre. No había una definición oficial de lo que significa "objeto similar a un archivo"; es simplemente "algo así como un objeto de archivo incorporado ", y diferentes funciones significan cosas diferentes por "me gusta". Tales funciones deben documentar lo que significan; si no es así, tienes que mirar el código.
Sin embargo, los significados más comunes son "tiene read(size)
", "tiene read()
" o "es un iterable de cadenas", pero algunas bibliotecas antiguas pueden esperar en readline
lugar de una de esas, algunas bibliotecas prefieren los close()
archivos que les proporcionas, algunos esperarán que si fileno
está presente, entonces hay otra funcionalidad disponible, etc. Y de manera similar para write(buf)
(aunque hay muchas menos opciones en esa dirección).
why
¿Qué pasa con los operadores como__add__
,__lshift__
o__or__
en clases personalizadas? (objeto de archivo y API: docs.python.org/glossary.html#term-file-object )