作为**解包的映射的python类

dsk*_*ner 57 python mapping class argument-unpacking

如果没有子类化dict,那么类需要被视为一个映射,以便它可以传递给**的方法

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
Run Code Online (Sandbox Code Playgroud)

至少到它抛出缺少映射功能的错误,所以我可以开始实现.

我查看了模拟容器类型,但只是定义魔术方法没有效果,并且使用ABCMeta覆盖并将其注册为dict将断言验证为子类,但是失败是isinstance(o,dict).理想情况下,我甚至不想使用ABCMeta.

Ray*_*ger 77

__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'}
Run Code Online (Sandbox Code Playgroud)


Nei*_*l G 22

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

__getitem__
__len__
__iter__
Run Code Online (Sandbox Code Playgroud)

mixin将实施一切为您提供: __contains__,keys,items,values,get,__eq__,和__ne__.