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 io
modul , yang dengan sendirinya semua subclass dari IOBase
. Jadi cara mengeceknya persis seperti gambar di atas.
(Namun, pemeriksaan IOBase
tidak terlalu berguna. Dapatkah Anda membayangkan kasus di mana Anda perlu membedakan file-like yang sebenarnya read(size)
dari beberapa fungsi satu-argumen bernama read
yang 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 io
modul sudah ada sejak 2.6+, objek file bawaan bukanlah instance io
kelas, 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 readline
alih-alih salah satunya, beberapa pustaka menyukai close()
file yang Anda berikan padanya, beberapa akan mengharapkan bahwa jika fileno
hadir maka fungsionalitas lain tersedia, dll. Dan juga untuk write(buf)
(meskipun ada lebih sedikit opsi ke arah itu).
why
bagaimana dengan operator yang disukai__add__
,__lshift__
atau__or__
di kelas khusus? (objek file dan API: docs.python.org/glossary.html#term-file-object )