将更多的kwargs传递给函数而不是最初设置

时间:2012-08-23 14:16:34

标签: python kwargs

有没有办法将更多的kwargs发送到函数调用中调用的函数?

示例:

def mydef(a, b):
    print a
    print b

mydict = {'a' : 'foo', 'b' : 'bar'}
mydef(**mydict)    # This works and prints 'foo' and 'bar'

mybigdict = {'a' : 'foo', 'b' : 'bar', 'c' : 'nooooo!'}
mydef(**mybigdict)   # This blows up with a unexpected argument error

有没有办法在没有错误的情况下传递mybigdict? <{1}}永远不会在我理想世界的'c'中使用,只会被忽略。

谢谢,我的挖掘并没有找到我想要的东西。

编辑:修改了一下代码。 mydef是我正在寻找的形式,但是检查功能args对我来说是一件新事物,对我的工具箱来说肯定是件事。谢谢大家!

2 个答案:

答案 0 :(得分:16)

不,除非函数定义允许更多参数(使用**kwargs catch-all语法),否则不能调用具有多于其定义的参数的方法。

可以内省该函数并删除它不会接受的任何参数:

import inspect

mybigdict = {'a2' : 'foo', 'b2' : 'bar', 'c2' : 'nooooo!'}
argspec = inspect.getargspec(mydef)
if not argspec.keywords:
    for key in mybigdict.keys():
        if key not in argspec.args:
            del mybigdict[key]
mydef(**mybigdict)

我正在使用inspect.getargspec() function检查可调用对象是否通过**kwarg支持.keywords catch-all,如果不支持,则使用.args删除该方法不支持的任何信息。

答案 1 :(得分:9)

澄清Martijn Pieters的答案(为了清楚起见)。如果将函数签名更改为:

,则可以

def mydef(a, b, **kwargs):

这意味着如果不改变签名就不可能。但如果那不是问题就行了。