Распаковка разного количества переменных

Я хочу сделать функцию гибкой в ​​отношении распаковки количества входных переменных.

Более конкретно, например, у меня есть следующее:

def flexi_func(vars):
    func_var_a, func_var_b, func_var_c, func_var_d = vars
    #do something

my_vars = [var_a, var_b, var_c, var_d]
flexi_func(my_vars)

Это прекрасно работает, если число входных переменных равно 4. Но, скажем, я хочу, чтобы одна и та же функция работала только с тремя или двумя входными переменными. Предположим, что бит "сделать что-то" уже гибкий. Затем распаковать переменные я могу написать

def flexi_func(vars):
    if len(vars) == 4:
        func_var_a, func_var_b, func_var_c, func_var_d = vars
    elif len(vars) == 3:
        func_var_a, func_var_b, func_var_c = vars
    elif len(vars) == 2:
        func_var_a, func_var_b = vars
    #do something

И это тоже отлично работает. Мне это кажется немного неуклюжим, особенно если бы у меня было N>4 переменных. Есть ли более чистый, более Pythonic способ распаковать кортеж таким образом, чтобы я мог использовать распакованные переменные?

Я знаю из этого вопроса, я могу сделать что-то вроде этого (в Python 3):

foo, bar, *other = func()

но мне нужно было бы сделать больше работы, чтобы получить доступ к материалам в otherтак что не лучше моего if...elif... подход.

1 ответ

Решение

Во-первых, в ответ на комментарии с просьбой указать контекст или конкретный пример, где это может быть необходимо, я допускаю, что почти во всех случаях, которые я могу придумать, должна быть возможность вообще избежать распаковки. Это касается и моей первоначальной проблемы - do something часть функции может быть изменена для доступа к элементам через индексы списка.

Однако, в принципе, я уверен, что существуют ситуации, когда требуется распаковка, хотя бы для ясности. Ниже представлен лучший способ присвоения переменной каждому элементу ввода. Более подробная информация приведена в ответах здесь и здесь.

def flexi_func(var_list):    
    for i, var in enumerate(var_list):
        vars()['my_func_{}'.format(i)] = var

    #do something 

    return

Это назначает каждую входную переменную vars() встроенный словарь. Это предпочтительнее globals() встроенный словарь и доступен для записи в отличие от locals() встроенный словарь. Чтобы получить доступ к переменным в do something раздел, вы должны ссылаться на словарь так: print(vars()['my_func_2']),

Наконец, если вы хотите использовать буквы в качестве меток переменных вместо цифр (как я делал в своем заявлении о проблеме), вы можете добавить alphabet = [chr(i) for i in range(ord('a'),ord('z')+1)] к вершине функции и вызвать переменные 'my_func_{}'.format(alphabet[i]),

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