は読書としてオープンそれを介して
def is_binary(f):
return isinstance(f.read(0), bytes)
は、それが確実にバイナリレベルを決定するであろう(IOError
を上げることができる)ストリームがすでに閉じられていた場合、それは動作しませんという警告を持っている:そのモードを決定するために、実際はそれからを読むことですどちらも適切なio
いろはから延びるもmode
属性を提供する任意のカスタムファイルのようなオブジェクトのネス。
だけのPython 3のサポートが必要な場合は、バイトとテキストの間に明確な区別与えられた書き込み可能なストリームのテキスト/バイナリモードを判断することも可能である:あなたが頻繁に流れているかどうかをテストしている場合を除き
def is_binary(f):
read = getattr(f, 'read', None)
if read is not None:
try:
data = read(0)
except (TypeError, ValueError):
pass # ValueError is also a superclass of io.UnsupportedOperation
else:
return isinstance(data, bytes)
try:
# alternatively, replace with empty text literal
# and swap the following True and False.
f.write(b'')
except TypeError:
return False
return True
を(ストリームのバイナリ・ネスは、オブジェクトの存続期間変更すべきではありませんので、不要である)バイナリモードであるかどうか、私はあなたが確かにするために最適化することができました(例外をキャッチするの広範な使用方法に起因するいかなるパフォーマンスの欠点が問題だろう疑いますしかし、尤度のパス)。
優れ、また、ドキュメントのリンクに感謝し、IOモジュールに私を指しています。私はまた、今私が考えていることを....非常に表面的である用語集で、[ファイルオブジェクト](https://docs.python.org/3.6/glossary.html#term-file-object)の定義を見つけましたそれについては、おそらくちょうど読書を試み、それが失敗した場合に例外をキャッチする別のpythonic方法でしょう。 – jdm
@jdm:cool!私がアクセプトマークを得るために追加したいものは何ですか?あなたが答えたものをマークしておらず、何も足りないものがないことを確認したいのであれば、それはいいですね:-) –
いいえ、答えはすばらしく、確かに受け入れられます:-) – jdm