为什么 type.Mapping 不是协议?

Lon*_*Rob 4 python

如此处所述,一些内置泛型类型是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)

大声喊出这个答案,因为它向我指出了有关协议的链接)

Nic*_*ley 5

这似乎是故意的,基本上可以归结为“我们认为该类型太复杂,无法作为协议”。请参阅https://www.python.org/dev/peps/pep-0544/#changes-in-the-typing-module

请注意,您可以通过扩展自己的类来获得此效果abc.Mapping