如何在 TypedDict 中拥有可选键?

g.p*_*dou 6 python type-hinting typeddict

TypedDict我正在尝试使用可选键创建一个,但Optional两者都NotRequired不起作用。(我NotRequired根据这个SO答案尝试过)

class MyTypedDict(TypedDict):
    my_key1: Optional[int]
    my_key2: NotRequired[int]

my_variable = MyTypedDict()
Run Code Online (Sandbox Code Playgroud)

对于我得到的两把钥匙Parameter 'my_key1' unfilledParameter 'my_key2' unfilled

我缺少什么?

d-k*_*-bo 14

NotRequired正是您正在寻找的。Optional[int]意味着int | None,但该项目仍然是必需的。如PEP 655NotRequired[int]中所述,任何注释为可省略的项目。

注意:如果您导入RequiredNotRequired来自typing_extensions(在 Python <3.11 上),您还应该导入TypedDictfrom typing_extensions

因此,如果您的类型检查器支持此功能,它应该只会抱怨缺少my_key1.

# Python >= 3.11
from typing import Optional, NotRequired, TypedDict

# Python < 3.11
from typing import Optional
from typing_extensions import NotRequired, TypedDict


class MyTypedDict(TypedDict):
    my_key1: Optional[int]
    my_key2: NotRequired[int]

my_variable = MyTypedDict()
# mypy error: Missing key "my_key1" for TypedDict "MyTypedDict"
# pyright error: Argument missing for parameter "my_key1"
Run Code Online (Sandbox Code Playgroud)


Joe*_*ley 3

您可以将必需值​​和可选值与继承和total. 来自mypy 文档

class MovieBase(TypedDict):
    name: str
    year: int

class Movie(MovieBase, total=False):
    based_on: str
Run Code Online (Sandbox Code Playgroud)

Movie具有必需的键nameyear, whilebased_on构造对象时可以省略