什么是 Python 映射?

Rom*_*rés 9 python syntax typeerror

假设我有一个函数func和一个objclass对象Class。我有以下错误:

>>> func(**obj)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: func() argument after ** must be a mapping, not Class
Run Code Online (Sandbox Code Playgroud)

因此我的问题是:什么是映射?所有映射都是 的子类吗dict?或者是否存在必须实现才能被视为映射的方法列表(例如__getitem__,,__iter__...) ?Class

khe*_*ood 13

术语“映射”在Python 术语表中的描述如下:

Mapping支持任意键查找并实现或抽象基类中指定的方法的容器对象MutableMapping。示例包括dictcollections.defaultdictcollections.OrderedDictcollections.Counter

子类的要求在其文档字符串collections.abc.Mapping中描述:

映射是用于关联键/值对的通用容器。

此类提供除__getitem____iter__和之外的所有方法的具体通用实现__len__

collections.abc.Mapping因此,您可以通过子类化并实现三个方法来定义新的映射类型: __len____getitem____iter__

>>> from collections.abc import Mapping
>>> def func(**kwargs):
...   print(kwargs)
...
>>> class MyMapping(Mapping):
...   def __len__(self):
...     return 1
...   def __getitem__(self, k):
...     return 'bananas'
...   def __iter__(self):
...     return iter(['custard'])
...
>>> func(**MyMapping())
{'custard': 'bananas'}
Run Code Online (Sandbox Code Playgroud)


vur*_*mux 7

根据Python 文档

支持任意键查找并实现 Mapping 或 MutableMapping 抽象基类中指定的方法的容器对象。示例包括:

  • 词典
  • 集合.defaultdict
  • 集合.OrderedDict
  • 收藏.柜台.

如果该类实现了Mapping / MutableMapping中的所有方法,则该类是一个映射

如果您将创建一个 Mapping/MutableMapping 派生类并实现所有这些,您将获得一个作为映射的类。