わかる
f.py
path = __file__
f = open(path)
print(type(f)) # <class '_io.TextIOWrapper'>
f.close()
with open(__file__) as fw:
print(type(fw)) # <class '_io.TextIOWrapper'>
with文はスコープを抜けるとデストラクタが呼ばれるため上記の場合f.close()
を省略できるというスグレモノである。よくある例なので特にどうということはない。
わからない
d.py
import tempfile
t = tempfile.TemporaryDirectory()
print(type(t)) # <class 'tempfile.TemporaryDirectory'>
with tempfile.TemporaryDirectory() as tt:
print(type(tt)) # <class 'str'> ←なんで文字列?
print(tt) # /tmp/tmp6nng15e8 ←中身はディレクトリパス
with文を使うとasで渡した変数に文字列、この場合は一時ディレクトリのパスが入りました。
どうしてこうなった?
ドキュメントを読むのが正規ルート。
3. データモデル — Python 3.7.3 ドキュメント
object.__enter__(self)
コンテキストマネージャのの入り口で実行される処理です。 with 文は、文の as 節で規定された値を返すこのメソッドを呼び出します。
tempfile.py
class TemporaryDirectory(object):
...
def __enter__(self):
return self.name
name
を返すようになっています。with文によってcleanup()
メソッド呼ばれるし、他に必要なメソッドがない、必要になるとしたらパスだけだから__enter__
で名前だけ返してやればいいよねって言うことか。