What’s New In Python 3.7 ノート

What’s New In Python 3.7 をたどりながら調査。興味のあるものだけ拾い読みしよう。

New Features

  • 組み込み関数 breakpoint() 新設

    • 環境変数 PYTHONBREAKPOINT の使い方を押さえれば言うことなし。

    • logging.basicConfig(level=logging.DEBUG) も必要。

    • これはふつうに便利なので覚えておこう。

  • モジュールに対して __getattr()__ および __dir__ が定義できる。

    • どちらも仕様者読書が想像する通りの振る舞いをする。

    • __getattr()__ は有用な利用例として二つ。DeprecatedWarning を送出する。遅延ロードを仕込む。

    • __dir__ を直接指定できることで、やはり deprecated な機能をリストの末尾に配置するなどの使用例を見込む。

    • これらは私は使わないだろう。

  • ナノ秒単位の分解能を持つ新しい時間関数が加わる。

    • モジュール time_ns() シリーズが追加された。

    • <The time.time_ns() resolution is 3 times better than the time.time() resolution on Linux and Windows> だそうだ。

    • サンプルコードで面白い呼び出しを見つけたので控えておく:

      min_dt = [abs(time.time_ns() - time.time_ns()) for _ in range(LOOPS)]
      min_dt = min(filter(bool, min_dt))
      print("min time_ns() delta: %s ns" % min_dt)
      

      ここで min(min_dt) だけでダメなのかどうか考えてみよう。

    • これらは私は使わないだろう。ミリ秒で事足りるケースしか手許にない。

  • 関数の仮引数、実引数ともに 255 個を超えられる。

New Modules

  • モジュール contextvars 新設

    • TLS みたいなものとある。とりあえず私は見ない。

    • モジュール decimal の関数 getcontext() が active context を返すのに本機能が使われている。

  • デコレーター @dataclass() 新設

    • C/C++ でいうところの構造体を定義するときに有用。

    • デフォルトでは次の特殊メソッドを自動的に定義する:

      • __init__()

      • __repr()__

      • __eq()__

      • __ne()__

      • __lt()__

      • __le()__

      • __gt()__

      • __ge()__

    • 実は dataclass() にはオプショナル引数がある。使うかもしれないので心に留めておく。

    • これに伴い標準ライブラリーの namedtuple() 系が機能強化。

    • その他細かい機能がたくさんある。仕様書を後で見る。というか、使いこなせるか。

Improved Modules

asyncio

ここは見るべきことが多い。

  • 関数 run() の新設。これによりコード量が若干少なく済む。

    • 例えば次のように書ける:

      # old
      loop = asyncio.get_event_loop()
      loop.run_until_completed(future)
      
      # new
      asyncio.run(future)
      
  • ループクラスの call_() 系メソッドが新モジュール contextvars の支援を受けられるようになる。すなわち、オプショナル引数でコンテキストオブジェクトを指定できる。

  • 関数 create_task() の新設。コード量が若干少なく済む。

collections

  • 関数 namedtuple() で属性に対するデフォルト値が指定できる。Docstring の記述をコード化するとこうなる:

    Point = namedtuple('Point', ['x', 'y', 'z'], defaults=[0, 0])
    
    pt = Point(1)
    assert pt.y == pt.z == 0
    

datetime

  • メソッド datetime.fromisoformat() の新設。メソッド datetime.isoformat() の逆。

functools

  • 関数 singledispatch() が typed annotations を用いる関数も受け容れるように改良された。

    • この関数を使ったことがないので今調べたら、Visitor パターンを実装するのがすごく楽になるものだ。

itertools

  • 関数 islice() の引数 start, stop, sliceint だけでなくて整数的オブジェクト、例えば NumPy の型 int32 に対しても機能するように改良された。

subprocess

  • 関数 run() にキーワード引数 capture_output が新設されて、この値を True にセットすると、標準出力と標準エラーが捕捉される。

    • 明示的にパイプを渡さないで出力を得る方法ができたことになる。

time

  • 先述のように、ナノ秒 API が新設された。

  • 関数 thread_time() および time.thread_time_ns() が新設された。

こんなところか。