关键字参数解包的要求

时间:2017-11-16 23:07:59

标签: python python-3.x python-2.7

在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之间是否有所不同?

2 个答案:

答案 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。