11

有没有办法将更多的 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没有错误的情况下通过吗? 'c'在我的理想世界中永远不会被使用,mydef只会被忽略。

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

编辑:稍微修正了代码。这mydef(a, b, **kwargs)是我正在寻找的形式,但检查函数 args 对我来说是一个新事物,并且绝对适合我的工具箱。感谢大家!

4

2 回答 2

19

不,除非函数定义允许更多参数(使用**kwargscatch-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()函数来检查可调用对象是否支持**kwarg包罗万象的 via .keywords,如果不支持,我将使用该.args信息删除该方法不支持的任何内容。

于 2012-08-23T14:17:47.227 回答
9

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

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

这意味着不更改签名是不可能的。但如果这不是问题,它会起作用。

于 2012-08-23T14:22:06.130 回答