Rom*_*rés 9 python syntax typeerror
假设我有一个函数func
和一个obj
class对象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
。示例包括dict
、collections.defaultdict
和collections.OrderedDict
。collections.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)
根据Python 文档:
支持任意键查找并实现 Mapping 或 MutableMapping 抽象基类中指定的方法的容器对象。示例包括:
- 词典
- 集合.defaultdict
- 集合.OrderedDict
- 收藏.柜台.
如果该类实现了Mapping / MutableMapping中的所有方法,则该类是一个映射。
如果您将创建一个 Mapping/MutableMapping 派生类并实现所有这些,您将获得一个作为映射的类。