有没有办法将更多的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对我来说是一件新事物,对我的工具箱来说肯定是件事。谢谢大家!
答案 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):
这意味着如果不改变签名就不可能。但如果那不是问题就行了。