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