Динамические функции Python с аргументами ключевого слова избегают неиспользуемого параметра

У меня есть часть кода на питоне, которая вызывает динамически разные функции, где я всегда хочу передать 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), передавая аргументы этого ключевого слова, и избежать жалоб на неиспользуемые параметры? (c не используется в fn1, b не используется в fn2, a не используется в fn3)

Я могу представить, что подавление предупреждений поможет, но я не думаю, что это подходящее решение.

ПРИМЕЧАНИЕ

Я использую Python 3.7.3


person Mayday    schedule 05.08.2020    source источник
comment
Какую версию Python вы используете?   -  person Iain Shelvington    schedule 05.08.2020
comment
@IainShelvington, я использую Python 3.7.3, извините, я тоже опубликую это в вопросе! Спасибо!!   -  person Mayday    schedule 05.08.2020


Ответы (2)


Вы можете определить аргументы как ключевое слово, только добавив к списку аргументов префикс *, тогда вы сможете избежать предупреждений о неиспользуемом параметре, назвав параметр _. Использование **_ позволяет нам игнорировать любые аргументы ключевого слова, которых нет в наших именованных параметрах.

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

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

def fn3(*, b, c, **_):
    return b + c
person Iain Shelvington    schedule 05.08.2020
comment
Идеальный подход! Именно то, что я искал! Как только я смогу принять ваш ответ, я приму его. Большое спасибо!! - person Mayday; 05.08.2020

Вы можете использовать функцию 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,
}
person Mullo    schedule 05.08.2020