解包不同数量的变量

Unpacking different numbers of variables

我想制作一个函数,它可以灵活地解包输入变量的数量。

更具体地说,例如我有以下内容:

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,则此方法工作正常。但是假设我想让相同的函数只对三个或两个输入变量进行操作。假设 'do something' 位已经是灵活的。然后解压我可以写的变量

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 的方式来解包元组,以便我可以使用解包的变量?

我从 this question 知道我可以做这样的事情(在 Python 3):

foo, bar, *other = func()

但我需要做更多的工作才能访问 other 中的内容,所以它并不比我的 if...elif... 方法好。

首先,针对要求提供上下文或可能需要这样做的具体示例的评论,我承认在我能想到的几乎所有情况下都应该可以完全避免拆包。这也适用于我原来的问题 - 可以修改函数的 do something 部分以通过列表索引访问项目。

但是,原则上,我确信存在需要解包的情况,即使只是为了清楚起见。下面是我能找到的为每个输入项分配变量的最佳方法。答案 here and here.

中给出了更多背景细节
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]).