Python 带关键字参数的动态函数避免使用未使用的参数

Python dynamic functions with keyword arguments avoid unused parameter

我在 python 中有一部分代码动态调用不同的函数,我总是想传递 3 个不同的参数。但是,这些函数可能并不总是需要使用这 3 个不同的参数。 这是显示问题的非常简单的代码:

def test_keyword_args():
    def fn1(a, b, c):
        return a + b

    def fn2(a, b, c):
        return a + c

    def fn3(a, b, c):
        return b + c

    obj = {
        'a': fn1,
        'b': fn2,
        'c': fn3,
    }

    for key in obj:
        value = obj[key](a=1, b=2, c=3)
        if key == 'a':
            assert value == 3
        if key == 'b':
            assert value == 4
        if key == 'c':
            assert value == 5

如何始终调用同一个函数 obj[key](a=1,b=2,c=3) 传递 this 关键字参数,并避免抱怨未使用的参数? (c 未在 fn1 中使用,b 未在 fn2 中使用,a 未在 fn3 中使用)

我可以想象抑制警告会起作用,但我认为这不是合适的解决方案

注意

我正在使用 Python 3.7.3

您可以仅通过在参数列表前加上 * 前缀来将参数定义为关键字,然后您可以通过将参数命名为 _ 来避免未使用参数警告。使用 **_ 允许我们忽略任何不在我们的命名参数中的关键字参数

def fn1(*, a, b, **_):
    return a + b

def fn2(*, a, c, **_):
    return a + c

def fn3(*, b, c, **_):
    return b + c

您可以使用 kwargs 功能将参数传递给函数。在这种情况下,kwargs 是带有传递给函数的命名参数的字典。

def fn1(a, b, **kwargs):
    return a + b

您可以以 fn1(a_value, b_value, any_parameter_1=100, any_parameter_2=100) 等格式将任何内容传递给此函数。在您收到的函数中您的变量 a 和 b 以及具有以下内容的 kwargs 字典

{
    "any_parameter_1": 100,
    "any_parameter_2": 1000,
}

您也可以将所有变量作为 kwargs 传递

def fn1(**kwargs):
    return kwargs["a"] + kwargs["b"]

但是你需要像这样给你的参数分配名称 fn1(a=a_value, b=b_value, any_parameter_1=100, any_parameter_2=100) kwargs 字典看起来像

{
    "a": a_value,
    "b": b_value,
    "any_parameter_1": 100,
    "any_parameter_2": 1000,
}