我想使用SimpleNameSpace
,它也可以作为映射,以便能够与**
解包使用。
以下是我所做的:
class MySimpleNameSpace(object):
# my initial attempt subclassed SimpleNameSpace and Mapping, with
# possibility to use MySimpleNameSpace as a dict as well as a normal SimpleNameSpace.
def __init__(self, **kw):
self.__dict__.update(kw)
def __getitem__(self, item):
return getattr(self, item)
def keys(self):
return self.__dict__.keys()
到目前为止一切顺利:
def f(**kw):
print(kw)
ns = MySimpleNameSpace(a=42)
f(**ns)
给予:{'a': 42}
更棘手:
ns.__getitem__ = "what"
ns.__iter__ = "da"
f(**ns)
现在给出:
{'a': 42, '__getitem__': "what", '__iter__', "da" }
可是:
ns.keys = "douh"
f(**ns)
显然给出了:
TypeError: attribute of type 'str' is not callable
任何想法是否可以使用这样的自定义映射类但是能够使用keys
作为普通属性?
我意识到子类化(Mutable)Mapping
使得它实际上更难,如果可能的话,但我认为这都是因为功能显然要求给定对象拥有keys
方法,如果我们找不到解决办法,这是不幸的。
据我所知:迭代(__iter__
)dict给出了它的键,然后__getitem__
给出了与给定键相关的值。据我所知,这足以实现功能吗?