Распаковка разного количества переменных
Я хочу сделать функцию гибкой в отношении распаковки количества входных переменных.
Более конкретно, например, у меня есть следующее:
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])
,