如果没有对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。
如果您试图创建一个映射,而不仅仅是满足传递给函数的要求,那么您真的应该从
collections.Mapping
继承。如documentation中所述,您只需实现:Mixin将为您实现所有其他功能:
__contains__
、keys
、items
、values
、get
、__eq__
和__ne__
。__getitem__()
和keys()
方法足以:相关问题 更多 >
编程相关推荐