はい、file
は、open()
によって生成されたコンテキストマネージャを参照する変数です。それは同じオブジェクトであることがあります。つまり、file
はファイルオブジェクトを参照します。
また、ここでは同じ効果に、これを行っている可能性:
file = open(filename, "a")
try:
file.write("Hello world")
finally:
file.close()
ので、ファイルが自動的にクローズされます。ファイルオブジェクトはコンテキストマネージャーです。彼らはcontext manager protocolをサポートしています。技術的にはwith context_manager as <name>
ターゲット変数は戻り値context_manager.__enter__()
にバインドされますが、ファイルオブジェクトはそのメソッドから復帰し、file.__exit__()
メソッドはファイルを閉じます。 with
compound statement documentationを参照してください。
さて、あなた印刷文字列表現を持っていない、それはrepr()
機能を使用して印刷しますオブジェクトとき:
>>> repr(open('/dev/null'))
"<_io.TextIOWrapper name='/dev/null' mode='r' encoding='UTF-8'>"
>>> print(repr(open('/dev/null')))
<_io.TextIOWrapper name='/dev/null' mode='r' encoding='UTF-8'>
ので、はい、これはちょうど別のオブジェクト、を有するものですカスタム、有用な表現。ファイルオブジェクトは、これを生産するobject.__repr__()
hook実装:
>>> open('/dev/null').__repr__()
"<_io.TextIOWrapper name='/dev/null' mode='r' encoding='UTF-8'>"
ファイルオブジェクトの名前もここに混乱することができます。これは、Pythonのファイルオブジェクトがio
moduleで定義された一連のオブジェクトの一部であるためです。 TextIOWrapper
objectはここバッファ(順番にFileIO
objectの形で生のバイナリファイルオブジェクトをラップしますBufferedReader
を、ラップ:
>>> devnull = open('/dev/null', 'r')
>>> devnull
<_io.TextIOWrapper name='/dev/null' mode='r' encoding='UTF-8'>
>>> devnull.buffer
<_io.BufferedReader name='/dev/null'>
>>> devnull.buffer.raw
<_io.FileIO name='/dev/null' mode='rb' closefd=True>
これは、あなたが正常にする必要はありませんすべてのちょうどハイテクディテールです
*は変数で、 'TextIOWrapper'オブジェクトを格納します。それはどういう意味ですか? – deceze
なぜそれは変数のように見えませんか?なぜそれは何も保存しないのですか?なぜそれが変数ではないと思いますか?あなたの質問から混乱がどこにあるのかは不明です。 –
ドキュメントは自由に利用できます[ここ](https://docs.python.org/3/reference/compound_stmts.html#with)。 – vaultah