充当**拆包映射的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覆盖它并将其注册为dict可以将断言验证为子类,但是使isinstance(o,dict)失败。理想情况下,我什至不想使用ABCMeta。


慕运维8079593
浏览 379回答 2
2回答

一只甜甜圈

该__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

如果您试图创建一个Mapping-不仅满足传递给函数的要求,那么您确实应该继承自collections.Mapping。如文档中所述,您只需要实现:__getitem____len____iter__mixin将实施一切为您提供: __contains__,keys,items,values,get,__eq__,和__ne__。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python