Python 3.7 新機能ノート
What’s New In Python 3.7 — Python 3.7.4 documentation をたどりながら調査。 興味のあるものだけ拾い読みしよう。
New Features
- 組み込み関数
breakpoint()新設- 環境変数
PYTHONBREAKPOINTの使い方を押さえれば言うことなし。 - これはふつうに便利なので覚えておこう。
- 環境変数
- モジュールに対して
__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()が新設された。
こんなところか。