没有子类字典,什么类需要被认为是映射,以便可以将其传递给带有**的方法from abc import ABCMetaclass uobj: __metaclass__ = ABCMetauobj.register(dict)def f(**k): return ko = uobj()f(**o)# outputs: f() argument after ** must be a mapping, not uobj至少会引发缺少映射功能的错误,因此我可以开始实施。我回顾了模拟容器类型的过程,但是简单地定义魔术方法无效,并且使用ABCMeta覆盖它并将其注册为dict可以将断言验证为子类,但是使isinstance(o,dict)失败。理想情况下,我什至不想使用ABCMeta。
2 回答
一只甜甜圈
TA贡献1836条经验 获得超5个赞
该__getitem__()和keys()方法就足够了:
>>> class D:
def keys(self):
return ['a', 'b']
def __getitem__(self, key):
return key.upper()
>>> def f(**kwds):
print kwds
>>> f(**D())
{'a': 'A', 'b': 'B'}
慕盖茨4494581
TA贡献1850条经验 获得超11个赞
如果您试图创建一个Mapping-不仅满足传递给函数的要求,那么您确实应该继承自collections.Mapping。如文档中所述,您只需要实现:
__getitem__
__len__
__iter__
mixin将实施一切为您提供: __contains__,keys,items,values,get,__eq__,和__ne__。
添加回答
举报
0/150
提交
取消