Для версии 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 )