Python 3 エンジニア認定実践試験対策3.2. Pythonの言語仕様 – with文

投稿日:

更新日:

カテゴリ:

Python言語仕様のwith文についてです。Javaで言うtry-with-resourcesといったところでしょう。

PythonのContext Managerというのは、Javaで言うClosableの概念に似てます。

要点

テキストの「3.2 with文」の内容について、自分なりにまとめた要点は以下です。
ご参考になれば嬉しいです。

テキストとの違い

    1. P49の見出しで次のようにありますが、manegerはmanagerのタイポかと思われます。

      3.2.3 標準ライブラリのデコレーター – @contextlib.contextmaneger

    2. テキストにある処理の実行時間を計測するコンテキストマネージャーの書き方が面白かったので、書いてみたら、少し異なりました。
      ※テキストのように対話型でやってると、間違えたときにやり直しが大変なので、下記ソースを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点を挙げられます。

      1. import書いてなかったので、初心者の私にとって何をimportすれば良いか謎ですね。。いちいち調べて書きました。
      2. テキストではtime()のようにそのまま呼べたようですが、実際書いてみたところは、time.time()time.sleep(2)のように書かなければいけなかったです。
        まあ、そのうち、なんでかが分かるようになるでしょう。
      3. テキストようにwith timed('sleep processing'):と書いたら、ソースコード自動整形ツールであるblackを通すと、シングルクォーテーションがダブルクォーテーションになります。
        printのところも同様です。シングルクォーテーションは著者の好みかもしれませんね。

投稿日

カテゴリー:

投稿者:

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です