Open1

PythonでTypedDictをネストする

きょきょ

pyrightにexperimentalFeaturesでinlined typed dictが入っている。

本議論は元々mypyリポジトリのissue#5149で立ち上がったものであり、このexperimental featureは、erictraut氏が最終的に正式な仕様に反映されることを目的として実装したものである。

https://github.com/python/mypy/issues/5149#issuecomment-1720524647

以下のような形で利用可能。

# pyright: enableExperimentalFeatures=true
Person = dict[{
    "name": str, 
    "pets": list[dict[{
        "name": str, 
        "age": int
    }]]
}]
person: Person = {
    "name": "John",
    "pets": [
        {"name": "Mittens", "age": 3},
        {"name": "Puffy", "age": 2},
    ]
}
age: int = person["pets"][0]["age"]

なお、enableExperimentalFeaturesの機能は変更されるか削除される可能性が高いので、実験目的以外では使用しないこととpyrightの公式Docsにおいて説明されている。

https://github.com/microsoft/pyright/blob/main/docs/configuration.md

当該issueにおいては、この議論はpython全体で標準化されるべきもので、mypy issueからpython/typing discussion forumへ移動すべきだという議論が立ち上がっている。

また、PythonのMailman3のスレッドにおいて既にいくらか議論が行われていることが指摘されている。

https://mail.python.org/archives/list/typing-sig@python.org/thread/HXRBE5BVHF4PNAJEDFCU2DXZJM7OZPED/