PEP342と343を読んだ
初めてちゃんと英語のPEP(Python Enhancement Proposals)を読んだ. Proposalだったら現在の仕様と違うんじゃないの? とか思ったけど, そのProposalのステータス(議論中・実装済み)とかがちゃんとトップに書いてあった.
PEP342
generatorの拡張仕様. それまでのiteratorと違ってyieldを式として扱ったりとか, 外部から値を渡せたりとかそんな感じの内容だった. エキスパートPythonプログラミングを読んでもぴんと来なかったが, PEPを読むとわかりやすい!
PEP343
withステートメントについて. withで始めたスコープは指定した変数が終了時に破棄されるとかそんな感じの仕様. PEPを書いた人の拘ってる部分がちゃんと捉えられているか怪しい.
withはContextManagerの__enter__をスコープの開始時に呼び, __exit__を終了時に呼ぶことを確実化するための技なのかな? そこで議論していたのが,
with VAR = EXPR:
BLOCK
という風に書く仕様が適切かどうか. この場合VAR自体が__exit__を持たねばならない. その代わりにEXPRをContextManagerとし
with EXPR as VAR:
と書く. 実際に行われるのは, VAR = EXPR.__start__()でVARが初期化され, ブロックの終了時にEXPR.__end__()が呼ばれる. このことで, VARからは__exit__という余計なものが見られず綺麗. みたいな話なんだろうか?
実際, fileオブジェクトはContextManagerの一種だけれど, __enter__はselfを返しているっぽくて, この機構はあまり意味をなしていない気がする. どういう点で重要なんだろうか.
まとめ
何はともあれPEPはまとまっているし, 言語仕様の意図もわかるし, 思ったより面白い読み物だった. また機会があれば積極的に読んでいきたい.