我有一段代码:
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”变量不应有错误。
1条答案
按热度按时间mccptt671#
与
dict
和typing.TypedDict
不同的是,一个常规元组永远不是一个namedtuple类的示例,毕竟,常规元组的元素不能通过名称访问,namedtuple类是一个元组子类,它增加了额外的功能。当您将dict注解为
dict[KeyTuple, int]
时,您告诉mypy所有键都将是KeyTuple
类型。与JavaMap
不同,这也适用于检索操作,而不仅仅是插入操作。试图使用错误类型的键调用dict.get
是静态类型错误。由于常规元组不是KeyTuple
的示例,storage.get(("kek",))
无效。或者使用
KeyTuple
调用get
:或者将您的dict注解为具有规则元组键: