Требование одного из двух наборов параметров в функции на основе первого параметра

У меня есть функция, которая имеет два основных параметра, которые определяют остальные обязательные параметры.

Например, если

main = 'a'

Тогда это требует параметров q, w, e

Но если main = 'b'

Тогда это требует параметров a, s, d

Для передачи в качестве аргументов функции.

Я понимаю, что я мог бы использовать **kwargs и добавить оператор if на основе main выбрать необязательные параметры, но мне было интересно, если бы был способ сделать это без необязательных аргументов, так как весь набор параметров требуется на основе main,

Какой самый питонный способ справиться с этим, не имея двух функций?

Решение kwargs ниже, чтобы сделать вопрос более воспроизводимым:

def function_(main, **kwargs):
    if main == 'a':
        q = kwargs.get('q')
        w = kwargs.get('w')
        e = kwargs.get('e')
        return q * w * e
    if main == 'b':
        a = kwargs.get('a')
        s = kwargs.get('s')
        d = kwargs.get('d')
        return a + d + s

2 ответа

Вы можете сделать следующее:

def function_(main, *args, **kwargs):
    if main == 'a':
        q, w, e = args
    elif main == 'b':
        a, s, d = args

Или, возможно, есть две функции, которые вы передаете:

def function_(main, *args, **kwargs):
    if main == 'a':
        function_a_(*args, **kwargs)
    elif main == 'b':
        function_b_(*args, **kwargs)

Но я бы оспаривал необходимость этой конструкции и вместо этого пытался бы делать это с обычными функциями с нормальными параметрами.

Ваши функции утверждают, что имеют "избыточные" операции. Вы можете абстрагировать их в функцию.

from functools import reduce
def myreduce(op, *args):
    return reduce(op, args)

Теперь определите функцию для каждой вещи, которую вы хотите вычислить:

from operator import add, mul
def funcA(a, b, c):
    return myreduce(add, a, b, c)

def funcB(a, b, c):
    return myreduce(mul, a, b, c)

Обратите внимание на вызов этих функций myreduce по-другому. funcA называется для main == "a", а также funcB называется для main == "b", Вы можете контролировать, какая функция вызывается if заявление. Это, конечно, надуманный пример, но на практике вы должны быть в состоянии сделать что-то подобное. Это IMO намного понятнее и удобнее в обслуживании, чем одна функция, которая делает все.

Другие вопросы по тегам