以下代码:
def f(a=1): pass kwargs = {} kwargs['a'] = 1 kwargs['b'] = 2 f(**kwargs)
(正确)引发异常:
Traceback (most recent call last): File "tt.py",line 8,in <module> f(**kwargs) TypeError: f() got an unexpected keyword argument 'b'
有没有办法,使用functools或其他方法来绕过这个并找出函数没有使用哪些参数,以便能够将它们传递给另一个函数?例如,我可能有另一个功能:
def g(a=None,b=None): pass
我要跟其打电话,例如
g(**kwargs)
但是我只想要传递b,因为a在前一个函数中已经“用完了”.
现在我知道这不是理想的编码,但有些情况下它可以派上用场,而且实际上很容易向用户解释,例如“其他参数将传递给f,任何未传递给f的参数都将传递给g”.
解决方法
我有点惊讶你问这个问题,并担心你正在做一些你可能会后悔的事情.
您是否尝试使用相同的字典调用不同的方法来提供所有参数组合?
如果是这样,则处理这种情况所需的复杂性不应该在被调用的方法中处理,而是在调用代码中处理,例如,通过将kwargs定制为要调用的特定方法:
def f(a=1): pass call_tailored_args(f,kwargs)
辅助函数将实现如下:
import inspect def tailored_args(f,kwargs): relevant_args = {k: v in kwargs if k in inspect.getargspec(f).args} f(**relevant_args)