Python 如何将dict的成员传递给函数

Python 如何将dict的成员传递给函数,python,Python,假设我有一个不受我控制的函数,该函数看起来如下所示: def some_func(foo, bar, bas, baz): do_something() return some_val 现在我想调用这个函数,从包含与这个函数的参数相同的键的dict中传递元素。我可以这样做: some_func(foo=mydict['foo'], bar=mydict['bar'], bas=mydict['bas'], baz=my

假设我有一个不受我控制的函数,该函数看起来如下所示:

def some_func(foo, bar, bas, baz):
    do_something()
    return some_val
现在我想调用这个函数,从包含与这个函数的参数相同的键的dict中传递元素。我可以这样做:

some_func(foo=mydict['foo'],
          bar=mydict['bar'],
          bas=mydict['bas'],
          baz=mydict['baz'])
有没有什么优雅的方法可以让我利用键与parm匹配这一事实来减少冗长的操作?我知道我可以通过整个dict,但是假设我不想或者不能改变函数来接受单个dict而不是单个参数

谢谢,
Jerry

这就是解包的理由:

some_func(**mydict)

另请参见Python教程。

如Sven所述,您可以使用
**
解包将
dict
传递给函数。但是,如果
dict
包含的键不是目标函数的参数名,则只有在您调用的函数使用
**
符号接受关键字参数时,此操作才有效。如果没有,您将得到一个错误

如果您调用的函数没有
**kwargs
参数,最简单的处理方法是添加一个参数。但如果你不能做到这一点,你有两种方法:

1) 编写一个包装函数:

def wrapper(foo, bar, baz, quux, **kwargs):
    return some_func(foo, bar, baz, quux)

wrapper(**mydict)
2) 编写一个函数来提取所需的dict键:

def extract(dikt, keys):
    return dict((k, dikt[k]) for k in keys.split())

some_func(**extract(mydict, "foo bar baz quux"))
3) 编写一个函数,对调用的函数进行内省,并从字典中提取所需的键——基本上与#2相同,只是您不必“重复”太多

请注意,这不允许您忽略函数签名中具有默认值的参数。您可以做一些额外的自省来允许这样做(func.func_defaults的长度决定哪些参数具有默认值)

此内省适用于Python2.x、Python3和更高版本,可能需要进行一些调整。出于这个原因,我更喜欢前两种方法中的一种


PS——感谢Sven在我的第二种方法中捕捉到我丢失的
***

如果有额外的dict元素不是有效的参数名,这是否有效?如果函数使用
***
符号接受关键字args,那么它就可以工作,在这种情况下,它会将额外的元素作为一个单独的字典,并可能忽略它们。否则为否。如果要传递未知数量的参数,可以为函数指定一个
**kwargs
参数。我不知道你在电话那头能这么做。谢谢我大概98%确定它不会工作,但我承认我从未使用过这个功能。这个问题展示了如何将dict缩减到有效子集:我建议使用
argnames=set(inspect.getargspec(action)[0]);kwargs={k:v代表k,v在dikt.iteritems()中,如果argnames中有k}
在InRosection版本中。这在Python2.7和3.x上都有效(如果您使用
dict()
而不是dicitonary理解,则在早期版本上也有效)。我还重新安排了代码,允许省略具有默认值的参数。
def call_with_dict(func, dikt):
    func(**dict((k, dikt[k]) for k in 
         func.func_code.co_varnames[:func.func_code.co_argcount]))

call_with_dict(some_func, my_dict)