Untuk 3.1+, salah satu dari berikut ini:
isinstance(something, io.TextIOBase)
isinstance(something, io.BufferedIOBase)
isinstance(something, io.RawIOBase)
isinstance(something, io.IOBase)
Untuk 2.x, "file-like object" merupakan hal yang terlalu kabur untuk diperiksa, tetapi dokumentasi untuk fungsi apa pun yang Anda hadapi diharapkan akan memberi tahu Anda apa yang sebenarnya mereka butuhkan; jika tidak, baca kodenya.
Seperti jawaban lain menunjukkan, hal pertama yang harus ditanyakan adalah apa yang sebenarnya Anda periksa. Biasanya, EAFP sudah cukup, dan lebih idiomatis.
Glossary yang mengatakan "file-seperti objek" adalah sinonim untuk "file objek", yang akhirnya berarti itu sebuah contoh dari salah satu dari tiga kelas dasar abstrak didefinisikan dalam satu iomodul , yang dengan sendirinya semua subclass dari IOBase. Jadi cara mengeceknya persis seperti gambar di atas.
(Namun, pemeriksaan IOBasetidak terlalu berguna. Dapatkah Anda membayangkan kasus di mana Anda perlu membedakan file-like yang sebenarnya read(size)dari beberapa fungsi satu-argumen bernama readyang bukan file-like, tanpa juga perlu membedakan antara file teks dan raw file biner? Jadi, sungguh, Anda hampir selalu ingin memeriksa, misalnya, "adalah objek file teks", bukan "adalah objek seperti file".)
Untuk 2.x, sementara iomodul sudah ada sejak 2.6+, objek file bawaan bukanlah instance iokelas, begitu pula objek seperti file di stdlib, dan juga bukan sebagian besar objek seperti file pihak ketiga. Anda akan bertemu. Tidak ada definisi resmi tentang apa arti "objek seperti file"; itu hanya "sesuatu seperti objek file bawaan ", dan fungsi yang berbeda berarti hal yang berbeda dengan "suka". Fungsi tersebut harus mendokumentasikan apa yang mereka maksud; jika tidak, Anda harus melihat kodenya.
Namun, arti yang paling umum adalah "has read(size)", "has read()", atau "is an iterable of strings", tetapi beberapa pustaka lama mungkin mengharapkan readlinealih-alih salah satunya, beberapa pustaka menyukai close()file yang Anda berikan padanya, beberapa akan mengharapkan bahwa jika filenohadir maka fungsionalitas lain tersedia, dll. Dan juga untuk write(buf)(meskipun ada lebih sedikit opsi ke arah itu).
whybagaimana dengan operator yang disukai__add__,__lshift__atau__or__di kelas khusus? (objek file dan API: docs.python.org/glossary.html#term-file-object )