繁体   English   中英

如何传递与 function 的位置参数同名的 kwarg?

[英]How to pass kwargs with the same name as a positional argument of a function?

我正在尝试从 SK-learn 调用一个包装器,它将其**kwargs传递给内部 function。 不幸的是,它的位置 arguments 之一与我想传入**kwargs的 arguments 之一具有相同的名称。 我不知道如何正确地通过它们。

例子:

# 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.

不要将这些参数设为“一级” arguments; 相反,接受 arguments 的字典,您将传递给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将 arguments 传递给内部 function ,并将a分别传递给outer_function

outer_function(partial(expects_parameter_b, b=20), a=10)
outer_function(partial(expects_parameter_a, a=10), a=20)

这避免了将 arguments 从outer_function传递到内部 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)

Output...

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}

暂无
暂无

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

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