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

充当**拆包映射的python类

充当**拆包映射的python类

鸿蒙传说 2019-12-13 15:10:27
没有子类字典,什么类需要被认为是映射,以便可以将其传递给带有**的方法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-12-14
?
MYYA

TA贡献1868条经验 获得超4个赞

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


__getitem__

__len__

__iter__

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



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

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号