为了账号安全,请及时绑定邮箱和手机立即绑定

充当**拆包映射的python类

充当**拆包映射的python类

慕运维8079593 2019-10-29 10:53:45
没有子类字典,什么类需要被认为是映射,以便可以将其传递给带有**的方法from abc import ABCMetaclass uobj:    __metaclass__ = ABCMetauobj.register(dict)def f(**k): return ko = uobj()f(**o)# outputs: f() argument after ** must be a mapping, not uobj至少会引发缺少映射功能的错误,因此我可以开始实施。我回顾了模拟容器类型的过程,但是简单地定义魔术方法无效,并且使用ABCMeta覆盖它并将其注册为dict可以将断言验证为子类,但是使isinstance(o,dict)失败。理想情况下,我什至不想使用ABCMeta。
查看完整描述

2 回答

?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

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


查看完整回答
反对 回复 2019-10-29
?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

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


__getitem__

__len__

__iter__

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


查看完整回答
反对 回复 2019-10-29
  • 2 回答
  • 0 关注
  • 378 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信