Para 3.1+, um dos seguintes:
isinstance(something, io.TextIOBase)
isinstance(something, io.BufferedIOBase)
isinstance(something, io.RawIOBase)
isinstance(something, io.IOBase)
Para 2.x, "objeto semelhante a arquivo" é uma coisa muito vaga para verificar, mas a documentação para qualquer função (ões) com a qual você está lidando, esperançosamente, dirá o que eles realmente precisam; se não, leia o código.
Como outras respostas apontam, a primeira coisa a se perguntar é o que exatamente você está verificando. Normalmente, o EAFP é suficiente e mais idiomático.
O glossário diz "arquivo-como objeto" é sinônimo de "objeto de arquivo", que em última análise significa que é uma instância de uma das três classes base abstratas definidas no o io
módulo , que são eles próprios todas as subclasses de IOBase
. Portanto, a forma de verificar é exatamente como mostrado acima.
(No entanto, a verificação IOBase
não é muito útil. Você pode imaginar um caso em que você precisa distinguir um arquivo real read(size)
de alguma função de um argumento chamada read
que não é semelhante a um arquivo, sem precisar também distinguir entre arquivos de texto e raw arquivos binários? Então, na verdade, você quase sempre deseja verificar, por exemplo, "é um objeto de arquivo de texto", não "é um objeto semelhante a um arquivo".)
Para 2.x, embora o io
módulo exista desde 2.6+, os objetos de arquivo embutidos não são instâncias de io
classes, nem qualquer um dos objetos semelhantes a arquivos no stdlib, nem a maioria dos objetos semelhantes a arquivos de terceiros que você é provável que encontre. Não havia uma definição oficial do que significa "objeto semelhante a um arquivo"; é apenas "algo como um objeto de arquivo embutido ", e funções diferentes significam coisas diferentes por "curtir". Essas funções devem documentar o que significam; se não, você deve olhar o código.
No entanto, os significados mais comuns são "tem read(size)
", "tem read()
" ou "é um iterável de strings", mas algumas bibliotecas antigas podem esperar em readline
vez de um desses, algumas bibliotecas gostam de close()
arquivos que você fornece, alguns esperam que se fileno
está presente, então outra funcionalidade está disponível, etc. E da mesma forma para write(buf)
(embora haja muito menos opções nessa direção).
why
o que acontece com os operadores como__add__
,__lshift__
ou__or__
em classes personalizadas? (objeto de arquivo e API: docs.python.org/glossary.html#term-file-object )