Для версии 3.1+ одно из следующих:
isinstance(something, io.TextIOBase)
isinstance(something, io.BufferedIOBase)
isinstance(something, io.RawIOBase)
isinstance(something, io.IOBase)
Для 2.x «файловый объект» - слишком расплывчатая вещь, чтобы проверить, но документация для любой функции (й), с которой вы имеете дело, надеюсь, скажет вам, что им на самом деле нужно; если нет, прочтите код.
Как указывают другие ответы, первое, что нужно спросить, - это то, что именно вы проверяете. Обычно достаточно EAFP, и это более идиоматично.
Словарь говорит «файл-подобный объект» является синонимом «файлового объекта», который в конечном счете означает , что это экземпляр одного из трех абстрактных базовых классов , определенных в в io
модуле , которые сами по себе все подклассы IOBase
. Итак, способ проверки точно такой, как показано выше.
(Однако проверка IOBase
не очень полезна. Можете ли вы представить себе случай, когда вам нужно отличить реальный файловый read(size)
от некоторой функции с одним аргументом, read
которая не является файловой, без необходимости различать текстовые файлы и необработанные бинарные файлы? Итак, действительно, вы почти всегда хотите проверить, например, «является ли объект текстовым файлом», а не «является ли объект подобным файлу».)
Для 2.x, хотя io
модуль существует с версии 2.6+, встроенные файловые объекты не являются экземплярами io
классов, ни один из файловых объектов в stdlib, а также большинство сторонних файловых объектов, которые вы наверняка встретите. Официального определения того, что означает «файловый объект», не существовало; это просто «что-то вроде встроенного файлового объекта », а разные функции означают разные вещи под «подобным». Такие функции должны документировать, что они означают; если нет, вы должны посмотреть на код.
Однако наиболее распространенными значениями являются «имеет read(size)
», «имеет read()
» или «является итерируемой строкой», но некоторые старые библиотеки могут ожидать readline
вместо одной из них, некоторые библиотеки любят close()
файлы, которые вы им даете, некоторые будут ожидать, что если fileno
присутствует, то доступны другие функции и т. д. И аналогично для write(buf)
(хотя в этом направлении вариантов намного меньше).
why
а как насчет операторов вроде__add__
,__lshift__
или__or__
в кастомных классах? (объект файла и API: docs.python.org/glossary.html#term-file-object )