Python3.11の新機能 Python 3.11の新機能(その8) 型ヒントの新機能 - PEP-655 TypedDictで要素の省略可・不可を個別に設定できるようになった

(その1) CPython高速化計画(その2) 特殊化適応的インタープリタ(その3) 関数呼び出しのインライン化(その4) 例外グループとTaskGroup(その5) PEP-646 可変長ジェネリックス(その6) PEP-673 Self型(その7) PEP-681 データクラス変換(その8) PEP-655 TypedDictの要素ごとに省略可・不可を指定する(その9) その他の型ヒント関連機能(その10) 正規表現 - アトミックグループとPossessive指定子(その11) 標準ライブラリ(その12) Python本体の機能追加

Python 3.11で追加された PEP-655 TypedDictで個別の要素ごとに省略可・不可を指定可能にする では、typing.Requiredtyping.NotRequired が追加され、辞書の個別の要素ごとに省略可・不可を指定できるようになりました。

TypedDict は決まったキーを持つ辞書オブジェクトの型宣言で、次のように辞書のキーと値を宣言できます。

from typing import TypedDict

class Address(TypedDict):
    addr1: str
    addr2: str
    postal: str

addr_a: Address = {'addr1': 'Tokyo', 'addr2': 'Japan', 'postal': '11111'} # Ok
addr_b: Address = {'addr1': 'Tokyo', 'addr2': 'Japan'} # Error

デフォルトでは、指定されているTypedDict の要素が辞書に存在する必要があり、一つでも欠けていればエラーとなります。ただし、クラスの引数として total=False を指定すると、任意の要素を省略できます。

from typing import TypedDict

class Address(TypedDict, total=False):
    addr1: str
    addr2: str
    postal: str

addr_b: Address = {'addr1': 'Tokyo', 'addr2': 'Japan'} # postalがないがエラーにはならない

Python 3.10までは、このようにすべての要素を必須とするか、またはすべての要素を省略可能とするかのどちらかしか選べませんでした。しかし、Python3.11では、あたらしくPEP-655 TypedDictの要素ごとに省略可・不可を指定する が実装され、typing.Requiredtyping.NotRequired を使って個別の要素ごとに省略可・不可を指定できるようになりました。

次の例では、AddressAddress2 はどちらも addr1postal が必須で、addr2は省略可能となっています。

from typing import TypedDict, Required, NotRequired

class Address(TypedDict):
    addr1: str # 省略不可
    addr2: NotRequired[str] # addr2のみ省略可能
    postal: str # 省略不可

addr_a: Address = {'addr1': 'Tokyo', 'postal': '11111'} # addr2がないがエラーにはならない


class Address2(TypedDict, total=False):
    addr1: Required[str] # 省略不可
    addr2: str # 省略可
    postal: Required[str] # 省略不可

addr_b: Address2 = {'addr1': 'Tokyo', 'postal': '11111'} # addr2がないがエラーにはならない
Copyright © 2001-2023 python.jp Privacy Policy python_japan
Amazon.co.jpアソシエイト
Amazonで他のPython書籍を検索