如所述here ,一些内置的泛型类型是 Protocols
。这意味着只要它们实现了某些方法,类型检查器就会将它们标记为与以下类型兼容:
If a class defines a suitable
__iter__
method, mypy understands that it implements theiterable
protocol and is compatible withIterable[T]
.
那么为什么 Mapping
不是协议(protocol)?
很明显感觉它应该是一个,正如this well up-voted SO answer所证明的那样:
typing.Mapping
is an object which defines the__getitem__
,__len__
,__iter__
magic methods
如果它是一个,我可以将行为类似于映射的东西传递到需要映射的函数中,但不允许这样做:
from typing import Mapping
class IntMapping:
def __init__(self):
self._int_map = {}
def __repr__(self):
return repr(self._int_map)
def __setitem__(self, key: int, value: int):
self._int_map[key] = value
def __getitem__(self, key: int):
return self._int_map[key]
def __len__(self):
return len(self._int_map)
def __iter__(self):
return iter(self._int_map)
def __contains__(self, item: int):
return item in self._int_map
def keys(self):
return self._int_map.keys()
def items(self):
return self._int_map.items()
def values(self):
return self._int_map.values()
def get(self, key: int, default: int) -> int:
return self._int_map.get(key, default)
def __eq__(self, other):
return self == other
def __ne__(self, other):
return self != other
x: Mapping = IntMapping() # Type checkers don't like this
大声喊叫 this answer为我指出有关协议(protocol)的链接)
最佳答案
这似乎是故意的,基本上可以归结为“我们认为该类型太复杂而不能成为协议(protocol)。”参见 https://www.python.org/dev/peps/pep-0544/#changes-in-the-typing-module .
请注意,您可以通过让自己的类扩展 abc.Mapping
关于python - 为什么 typing.Mapping 不是协议(protocol)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71299591/