python - 将比初始设置更多的 kwargs 传递给函数

标签 python keyword-argument

有没有办法将比函数调用中调用的更多的 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 对我来说是新事物,绝对适合我的工具箱。谢谢大家!

最佳答案

不可以,除非函数定义允许更多参数(使用 **kwargs 包罗万象的语法),否则您不能使用比定义的参数更多的参数调用方法。

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

import inspect

mybigdict = {'a2' : 'foo', 'b2' : 'bar', 'c2' : 'nooooo!'}
sig = inspect.signature(mydef)
if not any(p.kind == p.VAR_KEYWORD for p in sig.parameters.values()):
    for missing in mybigdict.keys() - sig.parameters.keys():
        del mybigdict[missing]
mydef(**mybigdict)

我正在使用 inspect.signature() function检查可调用对象是否支持 **kwarg 包罗万象(通过查找 Parameter.VAR_KEYWORD 条目),如果不支持,我使用 set difference mybigdict 和签名 .parameters 之间的映射,以删除该方法不支持的任何内容。

关于python - 将比初始设置更多的 kwargs 传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12093726/

相关文章:

python - 我们如何将字节作为关键字参数的键传递给函数?

python - python函数是否可以忽略未使用的kwargs

python - 将 Python dict 转换为 kwargs?

python - 需要在另一种方法中使用**kw(不是__init__)

python - 我该怎么做才能从 JetBrains 获得正常的 Python REPL

python - 为什么我的 game_loop 没有定义,尽管它是?

python - 关于何时应该在函数中使用全局变量的经验法则

python - Cython 类型的内存 View : what they really are?

python - 拆分出同时包含 str 和 int 的列

python - 从 python 中的位置参数生成关键字参数