gpt4 book ai didi

python - 如何覆盖 TypedDict 中的 __getitem__?

转载 作者:行者123 更新时间:2023-12-04 07:28:57 26 4
gpt4 key购买 nike

我正在尝试创建一个 TypedDict 子类,如果某个键会导致 KeyError 并且该键是TypedDict 的注释为 Optional。我意识到这不太可能,因为 TypedDict 除了定义注释外不能被子类化。有没有其他 Eloquent 方式来做到这一点?

这是我正在尝试做的事情:

from typing import TypedDict, get_args, get_origin

class FilledTypedDict(TypedDict):
def __getitem__(self, k):
if k in self.__annotations__:
annotation = self.__annotations__[k]
if get_origin(annotation) is Union and type(None) in get_args(annotation):
return None
return super().__getitem__(k)

这给了我一个 TypedDict classes can contain only type annotations。我该如何解决这个问题?

最佳答案

你没有。 TypedDict不是正确的类型,它是常规 dict表示具有明确定义的项目。

重点是没有 TypedDict 的实例和任何 dict正确的项目可以分配给 TypedDict变量。

from typing import TypedDict

class TD(TypedDict):
a: int
b: str

print(type(TD(a=1, b="two"))) # <class 'dict'>

td: TD = {"a": 1, "b": "two"} # valid

这使得无法向 TypedDict 添加行为, 因为它必须始终匹配 dict行为完全正确。

PEP 589 –– TypedDict - Methods are not allowed, since the runtime type of a TypedDict object will always be just dict (it is never a subclass of dict).


可以做的是满足“TypedDictOptional 值”类型——通过将缺失值显式设置为None。 .

from typing import Optional, TypedDict

class Call(TypedDict):
who: str
when: Optional[str]

call: Call
call = Call(who="Gwen", when="tomorrow") # valid
call = {"who": "me", "when": None} # valid
call = {"who": "us"} # error: Missing key 'when' for TypedDict "Call"

关于python - 如何覆盖 TypedDict 中的 __getitem__?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68059053/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com