python - 为什么 typing.Mapping 不是协议(protocol)?

标签 python

如所述here ,一些内置的泛型类型是 Protocols。这意味着只要它们实现了某些方法,类型检查器就会将它们标记为与以下类型兼容:

If a class defines a suitable __iter__ method, mypy understands that it implements the iterable protocol and is compatible with Iterable[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/

相关文章:

python - 为什么我的程序没有显示我告诉它的碰撞框?

python - 使用不同颜色的切片图 - 手动重新着色条形

python - 基于属性值的字段计算器

python - 三列A B C,当cumsum小于10时取A*B,然后取A*C

python - 如何从scrapyd向scrapy爬虫传递参数?

Python通过字符串名称导入子模块?

python正则表达式问题

python - pip install chatterbot 和 spacy 的错误

python - 必须使用 fibo_ 实例作为第一个参数调用未绑定(bind)的方法 f()(改为获取 classobj 实例)

python - 存储在 bcolz 中时数据大小会爆炸