Python 3.11で追加された PEP-655 TypedDictで個別の要素ごとに省略可・不可を指定可能にする では、typing.Required と typing.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.Required と typing.NotRequired を使って個別の要素ごとに省略可・不可を指定できるようになりました。
次の例では、Address
と Address2
はどちらも addr1
と postal
が必須で、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がないがエラーにはならない