我正在尝试从SK-learn调用包装器,该包装器将其**kwargs
传递给内部函数。不幸的是,它的位置自变量之一与我想在**kwargs
中传递的自变量之一同名。我不知道如何正确通过它们。
示例:
def outer_function(fn, a, **kwargs):
# do something entirely unrelated with a
fn(**kwargs)
def expects_parameter_a(a):
print(a)
def expects_parameter_b(b):
print(b)
outer_function(expects_parameter_b, a=10, b=20) # this works as expected.
> 20
outer_function(expects_parameter_a, a=10, a=20) # this doesn't work.
outer_function(expects_parameter_a, a=10, kwargs={"a": 20}) # this doesn't work.
outer_function(expects_parameter_a, a=10, **{"a": 20}) # this doesn't work.
不要将这些参数设为“第一级”参数;相反,接受要传递给fn
的参数的字典:
def outer_function(fn, a, fn_kwargs):
# do something entirely unrelated with a
fn(**fn_kwargs)
outer_function(expects_parameter_a, a=10, fn_kwargs={"a": 20})
这确实可以简化并概括为:
from functools import partial
def outer_function(fn, a):
...
fn()
outer_function(partial(expects_parameter_a, a=20))
# or:
outer_function(lambda: expects_parameter_a(a=20))
换句话说,不要让outer_function
完全担心传递参数,只需传递已经绑定了所有必需参数的可调用对象。
使用functools.partial
将参数传递给内部函数,并将functools.partial
分别传递给a
:
outer_function