在python中实现** kwargs构造

时间:2012-08-20 16:05:07

标签: python

我在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

1 个答案:

答案 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,它接受了第一个版本。