python 我对NamedTuple的行为有什么问题吗?

ruyhziif  于 2022-12-21  发布在  Python
关注(0)|答案(1)|浏览(92)

我有一段代码:

from typing import NamedTuple

class KeyTuple(NamedTuple):
    key: str

storage: dict[KeyTuple, int] = {}

storage.get(("kek",))

这会引发一个错误:

test_mypy.py:8: error: No overload variant of "get" of "dict" matches argument type "Tuple[str]"  [call-overload]
test_mypy.py:8: note: Possible overload variants:
test_mypy.py:8: note:     def get(self, KeyTuple, /) -> Optional[int]
test_mypy.py:8: note:     def [_T] get(self, KeyTuple, Union[int, _T], /) -> Union[int, _T]

但如果我尝试:

storage: dict[tuple[str], int] = {}

storage.get(("kek",))

mypy不会引发任何错误。
“NamedTuple”变量不应有错误。

mccptt67

mccptt671#

dicttyping.TypedDict不同的是,一个常规元组永远不是一个namedtuple类的示例,毕竟,常规元组的元素不能通过名称访问,namedtuple类是一个元组子类,它增加了额外的功能。
当您将dict注解为dict[KeyTuple, int]时,您告诉mypy所有键都将是KeyTuple类型。与Java Map不同,这也适用于检索操作,而不仅仅是插入操作。试图使用错误类型的键调用dict.get是静态类型错误。由于常规元组不是KeyTuple的示例,storage.get(("kek",))无效。
或者使用KeyTuple调用get

storage.get(KeyTuple('kek'))

或者将您的dict注解为具有规则元组键:

storage: dict[tuple[str], int] = {}

相关问题