在Python中支持自定义类的关键字参数解包需要什么?在Python 2.7和Python 3.6解释器中,尝试解压缩不兼容的类型时会出现以下错误消息:
>>> dict(**None)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: type object argument after ** must be a mapping, not NoneType
映射是否意味着该对象必须具体为collections.Mapping
的子类?或者映射在这种情况下是其中一种伪类型,例如 iterable ,您不必显式地将collections.Iterable
子类化为支持iter()
?这种行为在Python 2和3之间是否有所不同?
答案 0 :(得分:5)
Mapping是用于关联键/值对的通用容器。
为了使用字典解包,不必从collections.Mapping
继承。此外,collections.Mapping
是一个抽象类,所以你仍然必须覆盖一些方法,以便能够使用dict解包与它的任何子类。
对于 dict unpackable 的类的实例,类足以实现keys
方法和相应的__getitem__
方法以返回给定的值一把钥匙:
class D(object):
def __getitem__(self, key):
return 2
def keys(self):
return ['1','2','3']
print(dict(**D()))
# {'1': 2, '2': 2, '3': 2}
答案 1 :(得分:0)
以下是mapping
的<{3}}:
一个容器对象,它支持任意键查找并实现Mapping或MutableMapping抽象基类中指定的方法。示例包括dict,collections.defaultdict,collections.OrderedDict和collections.Counter。