2

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

1 回答 1

9

我去看了python源码,好像用keys()and__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,它接受第一个版本。

于 2012-08-20T16:31:10.043 回答