Python言語仕様のwith文についてです。Javaで言うtry-with-resources
といったところでしょう。
PythonのContext Manager
というのは、Javaで言うClosable
の概念に似てます。
要点
テキストの「3.2 with文」の内容について、自分なりにまとめた要点は以下です。
ご参考になれば嬉しいです。
テキストとの違い
-
- P49の見出しで次のようにありますが、manegerはmanagerのタイポかと思われます。
3.2.3 標準ライブラリのデコレーター – @contextlib.contextmaneger
- テキストにある処理の実行時間を計測するコンテキストマネージャーの書き方が面白かったので、書いてみたら、少し異なりました。
※テキストのように対話型でやってると、間違えたときにやり直しが大変なので、下記ソースをtimed.py
と適当なファイルに書きました。import contextlib import time @contextlib.contextmanager def timed(func_name): start = time.time() try: yield finally: end = time.time() print(f"{func_name}:(total: {end - start})") with timed("sleep processing"): time.sleep(2)
次のように実行できるはずです。
% python timed.py sleep processing:(total: 2.004774332046509)
では、どこが違うかというと、以下の3点を挙げられます。
- import書いてなかったので、初心者の私にとって何をimportすれば良いか謎ですね。。いちいち調べて書きました。
- テキストでは
time()
のようにそのまま呼べたようですが、実際書いてみたところは、time.time()
やtime.sleep(2)
のように書かなければいけなかったです。
まあ、そのうち、なんでかが分かるようになるでしょう。 - テキストように
with timed('sleep processing'):
と書いたら、ソースコード自動整形ツールであるblackを通すと、シングルクォーテーションがダブルクォーテーションになります。
print
のところも同様です。シングルクォーテーションは著者の好みかもしれませんね。
- P49の見出しで次のようにありますが、manegerはmanagerのタイポかと思われます。
コメントを残す