作为**解包映射的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

至少它会抛出映射功能缺失的错误,所以我可以开始实施。

我回顾了模拟容器类型,但简单地定义魔术方法没有效果,并且使用ABCMeta来覆盖并注册它作为一个字典验证断言作为子类,但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'}

如果你试图创建一个映射 - 不仅仅满足传递给函数的需求 - 那么你应该从collections.Mapping继承。 如文档中所述,您只需要实现:

__getitem__
__len__
__iter__

mixin将实现一切你: __contains__keysitemsvaluesget__eq____ne__

链接地址: http://www.djcxy.com/p/53591.html

上一篇: python class that acts as mapping for **unpacking

下一篇: Tuple comparison in Python