Python 将多于初始设置的KWARG传递到函数中

Python 将多于初始设置的KWARG传递到函数中,python,keyword-argument,Python,Keyword Argument,有没有一种方法可以向函数发送比函数调用更多的KWARG 例如: 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) # T

有没有一种方法可以向函数发送比函数调用更多的KWARG

例如:

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)
是我正在寻找的表单,但是inspect函数args对我来说是一个新事物,肯定是我工具箱中的东西。谢谢大家

否,除非函数定义允许使用更多参数(使用
**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)

我使用来检查可调用函数是否支持通过
.keywords
捕获所有的
**kwarg
,如果不支持,我使用
.args
信息来删除该方法不支持的任何内容。

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

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


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

我正在考虑建议在
mydef
的定义中添加一些
**kwargs
,但我想你会同意这是一个错误的好主意:没有办法确保参数的顺序……不过
inspect
方法会修改你的
mybigdict
,这可能会有一些不良的副作用。@PierreGM:复制很容易,不是吗?我试图以一种合理简洁的方式来说明一种技术,这里并没有涵盖所有可能发生的情况。您提供的代码是无效的,第一次调用也失败了。我想您想删除键中的2。请注意,虽然您可以执行
mydict={'a':'foo','b':'bar'}
并将其传递给
mydef(**dict)
。以这种方式使用dicts和(非)关键字参数并不常见。您有时会看到是否使用默认参数定义了mydef:
mydef(a=None,b=None)
,但很少看到使用常规参数以这种方式传递它。。。对于常规参数,您会更频繁地看到:
mytuple=('foo','bar')
,然后调用使用(单个)splat运算符:
mydef(*mytuple)
@mgilson:对位置参数使用关键字语法有时是完全合法和有用的。@MartijnPieters——我没有说它是非法的(我说它不常见)。即使通过关键字访问位置参数,我也能看到(一点点)。但是,打开字典查找位置参数,我看不出有什么用处。在我看来,函数正在接收什么并不清楚——你会用
dict
s而不是
tuples
?我没有遇到过这样的情况,我会…@deadstump——在我的工作流中,我将
元组
传递给位置参数,将
dicts
传递给默认参数和关键字参数。因此,我的一个典型函数调用可能如下:
myfunc(*mytuple,**mydict)
其中定义了
func
def func(a,b,c=2,**kwargs):
mytuple
可能是
(1,2)
。显然,有些人可能会采取不同的做法(就像你一直在做的那样),MartijnPieters证实了这一点。对于元组,顺序很重要,并且顺序是将参数传递给基础函数中的位置参数的顺序。