假设我有一个函数,它在函数中的不同位置重复了大量代码,我可以执行以下操作:def foo():
def bar():
# do some stuff
bar()
# do some other stuff
bar()
我可以在bar内“读取”在foo范围内的变量,此外,如果需要编辑它们,我可以这样做:
^{pr2}$
问题
现在假设我有几个函数,foo_1,foo_2,foo_3等等,所有这些函数都有相同的bar代码行。在每个foo_i内定义bar会很单调(更不用说每次我想更改bar)会很单调,但是下面的操作并不起作用,因为nonlocal似乎是在定义函数的范围内工作,而不是在其中调用函数:def bar():
nonlocal var1, var2 # SyntaxError: no binding for nonlocal 'var1' found
# do some stuff
def foo_1():
# stuff involving var1 and var2
bar()
# do some other stuff
bar()
潜在解决方案
解决这个问题的一种方法是传入所有需要更改的变量,然后再返回它们。像这样:def bar(var1, var2):
# do some stuff
return var1, var2
def foo_1():
# stuff involving var1 and var2
var1, var2 = bar(var1, var2)
# do some other stuff
var1, var2 = bar(var1, var2)
我的问题
上述解决方案存在一些问题:它比简单的bar()更为冗长(尤其是当变量较多时)
实际上,在每个foo_i中定义bar并没有多大的改进,因为假设我之前刚刚在bar中访问了一个变量,现在我决定编辑它。我不仅需要更改函数,而且还需要更改调用它的所有地方(因为现在我必须返回一个额外的变量)。在
有没有更好的方法来实现上述目标?在
(这感觉像是一个没有答案的问题,所以如果是重复的问题,我道歉。我还没找到任何东西。)