如此处所述,一些内置泛型类型是Protocols。这意味着只要它们实现某些方法,类型检查器就会将它们标记为与该类型兼容:
如果一个类定义了合适的
__iter__方法,mypy 就会理解它实现了iterable协议并且与Iterable[T].
那么为什么不是Mapping一个协议呢?
显然感觉它应该是一个,正如这个得到高度评价的答案所证明的那样:
typing.Mapping是一个定义__getitem__,__len__,__iter__魔术方法的对象
如果是的话,我可以将类似于映射的东西传递到需要映射的函数中,但这样做是不允许的:
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
Run Code Online (Sandbox Code Playgroud)
大声喊出这个答案,因为它向我指出了有关协议的链接)
这似乎是故意的,基本上可以归结为“我们认为该类型太复杂,无法作为协议”。请参阅https://www.python.org/dev/peps/pep-0544/#changes-in-the-typing-module。
请注意,您可以通过扩展自己的类来获得此效果abc.Mapping