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,- sliceが- intだけでなくて整数的オブジェクト、例えば NumPy の型- int32に対しても機能するように改良された。
subprocess¶
- 関数 - run()にキーワード引数- capture_outputが新設されて、この値を- Trueにセットすると、標準出力と標準エラーが捕捉される。- 明示的にパイプを渡さないで出力を得る方法ができたことになる。 
 
time¶
- 先述のように、ナノ秒 API が新設された。 
- 関数 - thread_time()および- time.thread_time_ns()が新設された。
こんなところか。