繁体   English   中英

参数不兼容时将字典解压缩为函数

[英]Dictionary unpacking into function when parameters are incompatible

我不确定是否有可能,我想将字典解压缩为函数,但没有类似的参数。 是否可以轻松地将字典限制为子集?

def foo(a=0, b=0, c=0):
    print("a=%s, b=%s, c=%s"%(a,b,c))

my_dict = {'a':10, 'b':20, 'd':40}
foo(**my_dict)

产量

TypeError                                 Traceback (most recent call last)
<ipython-input-1-d40731664736> in <module>()
      3 
      4 my_dict = {'a':10, 'b':20, 'd':40}
----> 5 foo(**my_dict)

TypeError: foo() got an unexpected keyword argument 'd'

我想获得

a=10, b=20, c=0

结果将自动拒绝“ d”。

这只是一个例子。 就我而言,函数不是我的,我无法重新定义她的参数,foo是不可修改的。

在与foo()类似的情况下,我有很多函数,这些函数是对象的方法。

有任何想法吗?

检查功能签名将有助于:

import inspect

params = inspect.signature(foo).parameters.keys()

foo(**{k: v for k, v in my_dict.items() if k in params})

这是使用inspect的(希望)正确的解决方案。 由于inspect返回的参数列表可能包含星型args,而且也可能仅包含位置args,因此仅比较名称是不够的。

import inspect

def filter_kwds(f, kwds):
    params = inspect.signature(f).parameters
    if any(p.kind == inspect.Parameter.VAR_KEYWORD for p in params.values()):
        return kwds
    else:
        return {k:kwds[k] for k, v in params.items()
                if k in kwds and v.kind in (inspect.Parameter.KEYWORD_ONLY,
                                            inspect.Parameter.POSITIONAL_OR_KEYWORD)}

def f(a, *b, c=4):
    pass

def g(a, *b, c=4, **d):
    pass

print(filter_kwds(f, dict(a=1, b=2, d=4)))
print(filter_kwds(g, dict(a=1, b=2, d=4)))

输出:

{'a': 1}
{'a': 1, 'b': 2, 'd': 4}

请注意,第一个示例中的函数省略了星号arg的名称,而在第二个示例中,该函数检测到双星号arg的存在,因此不进行过滤

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM