Per 3.1+, uno dei seguenti:
isinstance(something, io.TextIOBase)
isinstance(something, io.BufferedIOBase)
isinstance(something, io.RawIOBase)
isinstance(something, io.IOBase)
Per 2.x, "un oggetto simile a un file" è una cosa troppo vaga da controllare, ma la documentazione per qualsiasi funzione con cui hai a che fare, si spera, ti dirà di cosa hanno effettivamente bisogno; in caso contrario, leggi il codice.
Come sottolineano altre risposte, la prima cosa da chiedere è cosa stai controllando esattamente. Di solito, EAFP è sufficiente e più idiomatico.
Il glossario dice "file come oggetto" è sinonimo di "oggetto file", che in ultima analisi significa che è un esempio di una delle tre classi base astratte definite nel il iomodulo , che sono essi stessi tutte le sottoclassi di IOBase. Quindi, il modo per controllare è esattamente come mostrato sopra.
(Tuttavia, il controllo IOBasenon è molto utile. Riuscite a immaginare un caso in cui è necessario distinguere un effettivo file-like read(size)da una funzione con un argomento chiamata readche non è file-like, senza dover distinguere anche tra file di testo e raw file binari? Quindi, in realtà, vuoi quasi sempre controllare, ad esempio, "è un oggetto file di testo", non "è un oggetto simile a file".)
Per 2.x, mentre il iomodulo esiste dalla 2.6+, gli oggetti file incorporati non sono istanze di ioclassi, né lo sono nessuno degli oggetti simili a file nello stdlib, e nemmeno la maggior parte degli oggetti file di terze parti è probabile che tu incontri. Non esisteva una definizione ufficiale di cosa significhi "oggetto simile a file"; è solo "qualcosa come un oggetto file incorporato ", e funzioni diverse significano cose diverse con "mi piace". Tali funzioni dovrebbero documentare cosa significano; se non lo fanno, devi guardare il codice.
Tuttavia, i significati più comuni sono "ha read(size)", "ha read()" o "è un iterabile di stringhe", ma alcune vecchie librerie potrebbero aspettarsi readlineinvece di uno di questi, ad alcune librerie piacciono i close()file che gli dai, alcuni si aspetteranno che se filenoè presente, quindi sono disponibili altre funzionalità, ecc. E allo stesso modo per write(buf)(sebbene ci siano molte meno opzioni in quella direzione).
whyche dire degli operatori come__add__,__lshift__o__or__in classi personalizzate? (oggetto file e API: docs.python.org/glossary.html#term-file-object )