Для версии 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)
(хотя вариантов в этом направлении намного меньше).