解压不同数量的变量

时间:2018-08-30 00:22:11

标签: python iterable-unpacking

我想提供一个在分解输入变量数量方面灵活的函数。

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

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时。是否有一种更干净,更Python化的方式来对元组进行解包,以便可以使用解包后的变量?

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

foo, bar, *other = func()

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

1 个答案:

答案 0 :(得分:0)

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

但是,从原则上讲,我敢肯定,即使只是为了清楚起见,也存在需要拆箱的情况。以下是我可以找到的为每个输入项分配变量的最佳方法。答案herehere中提供了更多背景细节。

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])