【发布时间】:2018-09-23 00:21:04
【问题描述】:
假设我有一个函数,其中有一大段代码在函数内的各个地方重复,我可以执行以下操作:
def foo():
def bar():
# do some stuff
bar()
# do some other stuff
bar()
我可以在bar 内“读取”foo 范围内的变量,此外,如果我需要编辑它们,我可以这样做:
def foo():
# stuff involving var1 and var2
def bar():
nonlocal var1, var2
# do some stuff
bar()
# do some other stuff
bar()
问题
现在假设我有几个函数,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中访问了一个变量,我现在决定编辑。我不仅需要更改函数,而且在调用它的任何地方都需要更改(因为现在我必须返回一个额外的变量)。
有没有更好的方法来实现上述目标?
(这感觉像是一种无法回答的问题,所以如果这是一个重复的问题,我深表歉意。虽然我还没有找到任何东西。)
【问题讨论】:
-
简短回答:创建一个封装所有这些值的类。这将您必须传递的参数数量减少到 1。
-
(确保我理解正确)你的意思是类似于 namedTuple 吗??
-
不,是可变的。
-
啊,是的。好点子。谢谢:)
-
这听起来像是一个有两个属性的对象。它调用改变其属性的方法(或返回具有更新属性的新实例)。具体来说,您想做什么?
标签: python python-3.x scope python-nonlocal