我想提供一个在分解输入变量数量方面灵活的函数。
更具体地说,例如,我有以下内容:
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...
方法更好。
答案 0 :(得分:0)
首先,在回应要求上下文的评论或可能需要这样做的具体示例时,我承认,在几乎所有情况下,我都认为应该可以避免完全拆箱。这也适用于我原来的问题-函数的do something
部分可以修改为通过列表索引访问项目。
但是,从原则上讲,我敢肯定,即使只是为了清楚起见,也存在需要拆箱的情况。以下是我可以找到的为每个输入项分配变量的最佳方法。答案here和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])
。