3.1+ için aşağıdakilerden biri:
isinstance(something, io.TextIOBase)
isinstance(something, io.BufferedIOBase)
isinstance(something, io.RawIOBase)
isinstance(something, io.IOBase)
2.x için, "dosya benzeri nesne" kontrol edilemeyecek kadar belirsiz bir şeydir, ancak uğraştığınız işlev (ler) için belgeler umarız size gerçekte neye ihtiyaçları olduğunu söyleyecektir; değilse, kodu okuyun.
Diğer yanıtların da işaret ettiği gibi, sormanız gereken ilk şey, tam olarak neyi aradığınızdır. EAFP genellikle yeterlidir ve daha deyimseldir.
Sözlüğü "nesne benzeri dosya" sonuçta üç birinin bir örneği var demektir "dosya nesnesi", eş anlamlıdır diyor soyut temel sınıflar tanımlanan modül kendilerini her alt sınıflarıdır . Yani, kontrol etmenin yolu tam olarak yukarıda gösterildiği gibidir.io
IOBase
(Bununla birlikte, kontrol etmek IOBase
pek kullanışlı değildir. Gerçek bir dosya benzeri read(size)
, dosya benzeri olmayan tek bağımsız değişkenli bir işlevi read
, ayrıca metin dosyaları ve ham metin dosyaları arasında ayrım yapmanıza gerek kalmadan ayırt etmeniz gereken bir durum hayal edebiliyor musunuz? Yani, gerçekten, neredeyse her zaman kontrol etmek istersiniz, örneğin, "bir metin dosyası nesnesidir", "dosya benzeri bir nesnedir" değil.)
2.x için, io
modül 2.6+ sürümünden beri var olsa da , yerleşik dosya nesneleri io
sınıfların örnekleri değildir , stdlib'deki dosya benzeri nesneler ve üçüncü taraf dosya benzeri nesneler de değildir. karşılaşmanız muhtemeldir. "Dosya benzeri nesnenin" ne anlama geldiğine dair resmi bir tanım yoktu; bu sadece "yerleşik bir dosya nesnesi gibi bir şey " ve farklı işlevler "beğenmek" ile farklı şeyler ifade ediyor. Bu tür işlevler ne anlama geldiklerini belgelemelidir; yoksa, koda bakmanız gerekir.
Bununla birlikte, en yaygın anlamlar "vardır read(size)
", "vardır read()
" veya "dizelerin yinelenebiliridir", ancak bazı eski kitaplıklar readline
bunlardan biri yerine bekleyebilir , bazı kitaplıklar close()
onlara verdiğiniz dosyaları sever , bazıları ise fileno
o zaman diğer işlevler mevcuttur, vb. Ve benzer şekilde write(buf)
(bu yönde çok daha az seçenek olmasına rağmen).
why
Ne operatörleri gibi ilgili__add__
,__lshift__
ya da__or__
özel sınıflarda? (dosya nesnesi ve API: docs.python.org/glossary.html#term-file-object )