首页 > 解决方案 > 如何传递与函数的位置参数同名的kwargs?

问题描述

我正在尝试从 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.

标签: pythonpython-3.xkeyword-argument

解决方案


不要将这些参数设为“第一级”参数;相反,接受您要传递给的参数的字典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担心传递参数,只需传入一个已经绑定了所有必要参数的可调用对象。


推荐阅读