作为**解包映射的python类

没有子类的字典,什么类需要考虑映射,以便它可以传递给一个方法**

from abc import ABCMeta class uobj: __metaclass__ = ABCMeta uobj.register(dict) def f(**k): return k o = uobj() f(**o) # outputs: f() argument after ** must be a mapping, not uobj 

至less到它抛出映射的function缺失的错误,所以我可以开始实施。

我回顾了模拟容器types,但简单地定义魔术方法没有效果,并且使用ABCMeta来覆盖并注册它作为一个字典validation断言作为子类,但isinstance(o,dict)失败。 理想情况下,我甚至不想使用ABCMeta。

__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'} 

如果你正试图创build一个映射 – 不仅仅是满足传递给一个函数的需求 – 那么你真的应该inheritance自collections.Mapping 。 如文档中所述,您只需要实现:

 __getitem__ __len__ __iter__ 

Mixin将为您执行其他一切: __ne__keysitemsvaluesget__ne____ne__

Interesting Posts