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()が新設された。
こんなところか。