充当**解包映射的python类

2024-04-20 00:00:57 发布

您现在位置:Python中文网/ 问答频道 /正文

如果没有对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

至少到了它抛出缺少映射功能的错误的程度,这样我就可以开始实现了。

我回顾了模拟容器类型,但是简单地定义magic方法没有效果,使用ABCMeta重写并将其注册为dict将断言验证为子类,但是isinstance(o,dict)失败。理想情况下,我甚至不想使用ABCMeta。


Tags: fromimportregisterreturndefargumentoutputsdict
2条回答

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

__getitem__
__len__
__iter__

Mixin将为您实现所有其他功能:__contains__keysitemsvaluesget__eq____ne__

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

相关问题 更多 >