Published On: 2017-02-06|Last Updated: 2018-06-13|Categories: Python|Tags: |

ソースを読んだ方が早いのでそちらをどうぞ。相変わらず破壊的というかアグレッシブな機能の追加が目立つ。

PEP 468 — **kwargs の順序の保存, PEP 520 — クラス定義における変数の定義順の保存

>>> (lambda **kwargs: kwargs.items())(a=1, b=2)
dict_items([('a', 1), ('b', 2)])
>>> (lambda **kwargs: kwargs.items())(a=1, b=2, c=3)
dict_items([('a', 1), ('b', 2), ('c', 3)])
>>> (lambda **kwargs: kwargs.items())(a=1, b=2, c=3, d=4, e=5, f=6)
dict_items([('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5), ('f', 6)])

何じゃこりゃ…

>>> d = {}
>>> d['a'] = 1
>>> d['b'] = 2
>>> d.update(c=3, d=4)
>>> d.update([('e', 5), ('f', 6)])
>>> d
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6}

dict が OrderedDict になってる…

これはいろんなことに使えそう。

PEP 487 — __init_subclass__

まだ使っていないが、サブクラスを定義するときに呼び出されるらしい。はたして __new__ や __init__ が乱舞する空間からおさらば出来るか。

PEP 498 — f-string

str.format とは何だったのか。やや不自然に感じる記法だが、文字列リテラルをオブジェクトと捉えているからだろう。

PEP 506 — module secrets

PEP 515 — 数値リテラル中のアンダースコア

PEP 519 — os.PathLike など

os.PathLike は pathlib.Path の Abstract base class で、isinstance(x, PathLike) などとして使用する。また os.PathLike なオブジェクト (pathlib.Path など) が os モジュールのファイルシステム系関数などに直接渡せるようになった。以前の実装ではキャストが必要となってかなり不便で不自然だったため地味にありがたい。

os.PathLike は abc なのでオブジェクトの作成はできない。

>>> PathLike()
Traceback (most recent call last):
...
TypeError: Can't instantiate abstract class PathLike with abstract methods __fspath__py

3.5 以前も対応するコードでは次のようにするのが妥当だろうが、キャストは必要となる。

try:
    from os import PathLike
except ImportError:
    from pathlib import Path as PathLike

依然として ctypes に渡すパラメーターとしては str でキャストする必要がある。次のようなモンキーパッチを当てるだけで対応できるが積極的に使いたいテクニックではない:

import pathlib; pathlib.PurePath._as_parameter_ = property(lambda self: str(self))

PEP 525 — 非同期ジェネレーター (provisional), PEP 530 — 非同期内包表記

非同期周りの整備が続く。日本勢とかまるでついてこれてないぞ…

PEP 526 — 変数アノテーション (provisional)

pypiwin32

pywin32 が pypiwin32 という名前で pip install できるようになった。これが一番の改善かも。

関連