Python динамические c функции с аргументами ключевого слова избегают неиспользуемых параметров - PullRequest
1 голос
/ 05 августа 2020

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

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

ПРИМЕЧАНИЕ

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

Ответы [ 2 ]

2 голосов
/ 05 августа 2020

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

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

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

def fn3(*, b, c, **_):
    return b + c
1 голос
/ 05 августа 2020

Вы можете использовать kwargs функциональность для передачи аргументов функции. В этом случае kwargs - это словарь с именованными аргументами, переданными в функцию.

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

Вы можете передать что угодно в эту функцию в формате fn1 (a_value, b_value, any_parameter_1 = 100, any_parameter_2 = 100) et c . В функции вы получаете свои переменные 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,
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...