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

dea*_*ump 8 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
Run Code Online (Sandbox Code Playgroud)

有没有办法传递mybigdict没有错误? 'c'永远不会mydef在我的理想世界中使用,只会被忽略.

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

编辑:修改了一下代码.这mydef(a, b, **kwargs)是我正在寻找的形式,但检查功能args对我来说是一个新事物,绝对是我工具箱的东西.感谢大家!

Mar*_*ers 17

不,除非函数定义允许更多参数(使用**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)
Run Code Online (Sandbox Code Playgroud)

我正在使用该inspect.getargspec()函数检查callable是否支持**kwargcatch-all via .keywords,如果没有,我使用该.args信息删除该方法不支持的任何内容.


Exe*_*ian 9

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

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

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