背景
- 「準備→作業→後始末」、準備と後始末は共通の手続き、作業はいろいろ。
- try ... finallyは何となく見栄えがよくないような?
- openやfabricのcdのような、with構文を作りたい。
-
__enter__
とか、__exit__
とか、難しそう・・・。 - rubyのブロック付きメソッドとyieldのような感じで簡単つくれないかなぁ。
解法
contextmanagerデコレータを使うことで、比較的簡単に、また、rubyのブロックに近い感覚で書くことができる。
参考リンクのままの例だが
from contextlib import contextmanager
@contextmanager
def tag(name):
print "<%s>" % name
yield
print "</%s>" % name
>>> with tag("h1"):
... print "foo"
...
<h1>
foo
</h1>
こんな感じです。
詳細
- withブロックから抜ける手段が無い。