如何传递与函数的位置参数同名的 kwargs?
How to pass kwargs with the same name as a positional argument of a function?
我正在尝试从 SK-learn 调用一个包装器,它将其 **kwargs
传递给一个内部函数。不幸的是,它的位置参数之一与我想在 **kwargs
中传递的参数之一同名。我不知道如何正确地传递它们。
示例:
# This is a stand-in for a library function. I can't modify its behaviour.
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.
不要让这些参数成为 "first level" 参数;相反,接受你要传递给 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
将参数传递给内部函数,并分别将a
传递给outer_function
:
outer_function(partial(expects_parameter_b, b=20), a=10)
outer_function(partial(expects_parameter_a, a=10), a=20)
这避免了将参数从 outer_function
传递到内部函数,从而避免了任何冲突。请注意,outer_function
无需修改即可生效。
你可以试试这个
def f1(*args, **kwargs):
print("args : ", args)
print("kwargs : ", kwargs)
f1()
f1(1, 2)
f1(a=100, b=200)
f1(1, a=100)
f1(1, 2, a=100, b=200)
输出...
args : ()
kwargs : {}
args : (1, 2)
kwargs : {}
args : ()
kwargs : {'a': 100, 'b': 200}
args : (1,)
kwargs : {'a': 100}
args : (1, 2)
kwargs : {'a': 100, 'b': 200}
我正在尝试从 SK-learn 调用一个包装器,它将其 **kwargs
传递给一个内部函数。不幸的是,它的位置参数之一与我想在 **kwargs
中传递的参数之一同名。我不知道如何正确地传递它们。
示例:
# This is a stand-in for a library function. I can't modify its behaviour.
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.
不要让这些参数成为 "first level" 参数;相反,接受你要传递给 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
将参数传递给内部函数,并分别将a
传递给outer_function
:
outer_function(partial(expects_parameter_b, b=20), a=10)
outer_function(partial(expects_parameter_a, a=10), a=20)
这避免了将参数从 outer_function
传递到内部函数,从而避免了任何冲突。请注意,outer_function
无需修改即可生效。
你可以试试这个
def f1(*args, **kwargs):
print("args : ", args)
print("kwargs : ", kwargs)
f1()
f1(1, 2)
f1(a=100, b=200)
f1(1, a=100)
f1(1, 2, a=100, b=200)
输出...
args : ()
kwargs : {}
args : (1, 2)
kwargs : {}
args : ()
kwargs : {'a': 100, 'b': 200}
args : (1,)
kwargs : {'a': 100}
args : (1, 2)
kwargs : {'a': 100, 'b': 200}