在python中实现**kwargs构造

在python中实现**kwargs构造,python,Python,我用python实现了一个类,该类当前继承自dict,但实际上,我不希望它这样做。继承的主要原因是,我可以使用**kwargs构造将内容复制到参数列表中 我假设python在字典上进行了某种迭代,但我找不到任何文档 这是否可能,如果可能,如何实现 编写示例代码只是为了让事情更清楚: class MyThing(): def __init__(self): self.dictionary = {} thing = MyThing() #

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

我阅读了python源代码,它似乎使用了
keys()
\uu getitem\uu
方法

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}))
出于好奇,如果在非dict上使用**,CPython将创建一个新的空dict,然后调用
dict.update()
将对象的键复制到dict中

最好将其作为
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]
由于映射的继承性,几乎支持所有dict方法。考虑到错误消息,我认为您可以认为这应该适用于所有python实现


我试过PyPy,它接受第一个版本。

你的问题太模糊了。您可以使用诸如dict中key的
或dict.iteritems()中key的val的
之类的常用内容来迭代字典。你到底想做什么?您尝试过什么?换句话说,您希望能够执行
anyfunc(**myclassinstance)
?您可以对传入或传出任何可调用的任意参数使用
**
,它只会尝试将其作为
dict
解压到本地命名空间中。你能提供一个代码示例让我们看看你真正需要什么吗?我敢打赌
**
使用
迭代器
接口,因此,在
myclass
中定义
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu来自
集合
模块的
映射
。然而,我对abc的了解到此为止……这是对Cpython的一个很好的回答。它似乎在Jython中不起作用。为了让它在那里工作,我需要添加一个
\uu len\uu
方法。我目前没有pypy,所以我无法测试它……dict解包机制是否作为Python规范的一部分正式公开?从这个答案和mgilson的评论来看,似乎不是。。。我试着四处看看,但什么也找不到。不,据我所知不是。从
dict
collections.Mapping
collections.abc.Mapping
在Python 3中)派生是最安全的。