W przypadku wersji 3.1+, jedno z poniższych:
isinstance(something, io.TextIOBase)
isinstance(something, io.BufferedIOBase)
isinstance(something, io.RawIOBase)
isinstance(something, io.IOBase)
W przypadku 2.x „obiekt plikopodobny” jest zbyt niejasny, aby go sprawdzić, ale dokumentacja wszelkich funkcji, z którymi masz do czynienia, powie ci, czego faktycznie potrzebują; jeśli nie, przeczytaj kod.
Jak wskazują inne odpowiedzi, pierwszą rzeczą, o którą należy zapytać, jest to, czego dokładnie szukasz. Zwykle EAFP jest wystarczający i bardziej idiomatyczny.
Słowniczek mówi „plikopodobnym obiektu” jest synonimem „obiektu pliku”, co ostatecznie oznacza, że jest to przykład jednej z trzech klas abstrakcyjnych zasad określonych w tym iomodule , które same są wszystkie podklasy IOBase. Tak więc sposób sprawdzenia jest dokładnie taki, jak pokazano powyżej.
(Jednak sprawdzanie IOBasenie jest zbyt przydatne. Czy możesz sobie wyobrazić przypadek, w którym musisz odróżnić rzeczywisty plik podobny read(size)do jakiejś jednoargumentowej funkcji o nazwie, readktóra nie jest podobna do pliku, bez konieczności rozróżniania między plikami tekstowymi i nieprzetworzonymi pliki binarne? Więc tak naprawdę prawie zawsze chcesz sprawdzić, np. „czy jest obiektem pliku tekstowego”, a nie „jest obiektem podobnym do pliku”).
W przypadku wersji 2.x, chociaż iomoduł istnieje od wersji 2.6+, wbudowane obiekty plików nie są instancjami ioklas, ani żadne z obiektów typu plikowego w standardowej bibliotece, ani też większość obiektów podobnych do plików innych firm. mogą się spotkać. Nie było oficjalnej definicji tego, co oznacza „obiekt podobny do pliku”; jest to po prostu „coś w rodzaju wbudowanego obiektu pliku ”, a różne funkcje oznaczają różne rzeczy przez „polubienie”. Takie funkcje powinny dokumentować ich znaczenie; jeśli nie, musisz spojrzeć na kod.
Jednak najczęstsze znaczenia to „ma read(size)”, „ma read()” lub „jest iterowalna z ciągami znaków”, ale niektóre stare biblioteki mogą oczekiwać readlinezamiast jednego z nich, niektóre biblioteki lubią close()pliki, które im dajesz, inne będą oczekiwać, że jeśli filenojest obecny, wtedy dostępna jest inna funkcjonalność itp. I podobnie w przypadku write(buf)(chociaż jest o wiele mniej opcji w tym kierunku).
whyco operatorzy podoba__add__,__lshift__lub__or__w niestandardowych klas? (obiekt pliku i API: docs.python.org/glossary.html#term-file-object )