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はまとまっているし, 言語仕様の意図もわかるし, 思ったより面白い読み物だった. また機会があれば積極的に読んでいきたい.