【问题标题】:How to have optional keys in TypedDict?如何在 TypedDict 中设置可选键?
【发布时间】:2022-11-17 22:32:20
【问题描述】:

我正在尝试使用可选键创建一个 TypedDict,但 OptionalNotRequired 都不起作用。 (我试过NotRequired基于this SO answer

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

my_variable = MyTypedDict()

对于这两个键,我得到了Parameter 'my_key1' unfilledParameter 'my_key2' unfilled

我错过了什么?

【问题讨论】:

  • 你使用哪种类型检查器?

标签: python type-hinting typeddict


【解决方案1】:

NotRequired 正是您要找的。 Optional[int]表示int | None,但该项目仍然是必需的。注释为NotRequired[int] 的任何项目都可以按照PEP 655 中的说明省略。

笔记:如果您从 typing_extensions 导入 RequiredNotRequired(在 Python <3.11 上),您还应该从 typing_extensions 导入 TypedDict

因此,如果您的类型检查器支持此功能,它应该只会抱怨缺少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"

【讨论】:

  • 很多谢谢。不幸的是,似乎 PyCharm 内置类型检查器不支持这一点,我得到了 NotRequired[int] 行的“值必须是一种类型”。我不知道 PyCharm 使用的是哪种类型检查器,但要获得它似乎并不容易,既不配置外部类型检查器以与 IDE 无缝工作
【解决方案2】:

您可以将必需值​​和可选值与继承和 total 混合使用。来自mypy docs

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

class Movie(MovieBase, total=False):
    based_on: str

Movie 需要键 nameyear,而 based_on 可以在构造对象时省略

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 2020-05-17
    • 1970-01-01
    • 1970-01-01
    • 2019-04-04
    • 2020-08-25
    • 1970-01-01
    相关资源
    最近更新 更多