3.1+の場合、次のいずれかです。
isinstance(something, io.TextIOBase)
isinstance(something, io.BufferedIOBase)
isinstance(something, io.RawIOBase)
isinstance(something, io.IOBase)
2.xの場合、「ファイルのようなオブジェクト」はチェックするのが漠然としすぎていますが、処理している関数のドキュメントで、実際に必要なものを説明できれば幸いです。そうでない場合は、コードを読んでください。
他の回答が指摘するように、最初に尋ねるべきことは、正確に何をチェックしているかです。通常、EAFPで十分であり、より慣用的です。
用語集では、「ファイルのようなオブジェクト」は「ファイルオブジェクト」の同義語であり、最終的には、モジュールで定義された 3つの抽象基本クラスのいずれかのインスタンスであり、それ自体がすべてのサブクラスであると述べています。したがって、確認方法は上記とまったく同じです。io
IOBase
(ただし、チェックIOBase
はあまり役に立ちません。テキストファイルとrawを区別する必要なしに、実際のファイルのようにread(size)
、ファイルのように名前が付けられread
ていない1つの引数を持つ関数と区別する必要がある場合を想像できますか。バイナリファイルですか?つまり、実際には、ほとんどの場合、たとえば、「ファイルのようなオブジェクトであるか」ではなく、「テキストファイルオブジェクトであるか」を確認する必要があります。
2.xの場合、io
モジュールは2.6以降で存在しますが、組み込みファイルオブジェクトはio
クラスのインスタンスではなく、stdlibのファイル類似オブジェクトでも、サードパーティのファイル類似オブジェクトでもありません。出会う可能性が高いです。「ファイルのようなオブジェクト」が何を意味するかについての公式の定義はありませんでした。それは単に「組み込みファイルオブジェクトのようなもの」であり、関数が異なると「好き」によって意味が異なります。このような関数は、それらの意味を文書化する必要があります。そうでない場合は、コードを確認する必要があります。
ただし、最も一般的な意味は「has read(size)
」、「has read()
」、または「is itableable of strings」ですが、一部の古いライブラリreadline
はそれらのいずれかではなく予期する場合があり、一部のライブラリは指定したclose()
ファイルに似ています。fileno
が存在する場合は、他の機能を利用できます。同様にwrite(buf)
(その方向にははるかに少ないオプションがあります)。
why
などの演算子__add__
、__lshift__
または__or__
カスタムクラスではどうですか?(ファイルオブジェクトおよびAPI:docs.python.org/glossary.html#term-file-object)