我在python中实现了一个目前继承自dict的类,但实际上,我不希望它。继承的主要原因是我可以使用** kwargs构造将内容复制到参数列表中。
我认为python对字典做了某种迭代,但我找不到任何文档。
这是可能的,如果是的话,怎么样?
代码示例只是为了让事情更清楚:
class MyThing():
def __init__(self):
self.dictionary = {}
thing = MyThing()
# code that causes thing.dictionary to be populated
somefunc(**thing)
结果如下:
TypeError: somefunc() argument after ** must be a mapping, not instance
答案 0 :(得分:8)
我去阅读python源代码,似乎使用了keys()
和__getitem__
方法
class A:
def __init__(self, data):
self.data = data
def keys(self):
return self.data.keys()
def __getitem__(self, key):
return self.data[key]
def f(alpha):
print alpha
f(**A({'alpha': 2}))
对于好奇的人,如果你在非字典上使用**,CPython会创建一个新的空字典,然后调用dict.update()
将你的对象的密钥复制到字典中。
最好将其作为collections.Mapping
class A(Mapping):
def __init__(self, data):
self.data = data
def __iter__(self):
return iter(self.data)
def __len__(self):
return len(self.data)
def __getitem__(self, key):
return self.data[key]
由于Mapping的继承,几乎支持所有dict方法。鉴于错误消息,我认为您可以认为这应该符合python的所有实现。
我尝试过PyPy,它接受了第一个版本。