在我必须执行此操作的少数情况下,我使用了global
关键字。目前我正在清理一些不是我的代码,在没有闭包的While语句之后基本上是200行。我想将功能上的所有内容分成较小的位,但问题是在这200行中有很多对相同变量的引用。有没有办法让嵌套函数访问所有父变量而不明确声明它们?
原来很久以来的陈述:
While True:
var1, var2, var3, var4 = x, [], {}, y
#does something with var2, var3 and var4
#does something with var1 and var3
#does something with var4 and var1
#etc.
到---> 编辑:这是一个不正确的解决方案,如果是这样,为什么?
class My:
pass
def foo():
#does something with My.var2, My.var3 and My.var4
def bar():
#does something with My.var1 and My.var3
def tar():
does something with My.var4 and My.var1
While True:
My.var1, My.var2, My.var3, My.var4 = x, [], {}, y
#There are a lot of variables to keep track off and declaring each one
# as global will take a lot of extra declarations
foo()
bar()
tar()
答案 0 :(得分:2)
跟踪类似变量的另一种方法是将它们放在一个类中。 例如:
class MyClass(object):
def __init__(self, v1, v2, v3, v4):
self.var1 = v1
self.var2 = v2
self.var3 = v3
self.var4 = v4
def run(self):
while True:
self.foo()
self.bar()
self.tar()
def foo(self):
"""does something with var2, var3 and var4"""
return self.var2, self.var3, self.var4
def bar(self):
"""does something with var1 and var3"""
return self.var1, self.var3
def tar(self):
"""does something with var4 and var1"""
return self.var4, self.var1
if __name__ == "__main__":
mc = MyClass('x', [], {}, 'y')
mc.run()
答案 1 :(得分:0)
更改函数以使用参数,并从while循环中获取函数。
例如:
def foo(var2, var3, var4)
return var2 + var3 + var4
def bar(var1, var3)
return var1 * var3
...
While True:
var5 = foo(var2,var3,var4)
var1 = bar(var1,var3)
等
答案 2 :(得分:0)
我有一个函数调用scipy.optimize.fmin_l_bfgs_b()该函数接受另一个被重复调用的函数。我有这个功能的几个版本,使用不同的优化方式,用户可以选择。
为了将它们保持在一起,我做你正在谈论的事情,但我确保在实际的实例化方法之外进行循环。所以,它看起来像这样:
`def MethodOne(var1,var2): def InnerFn1(...): ... def InnerFn2(...): ....
for i in range(0, var1):
CallFunctionWhichCallsAnFnAbove(var2, InnerFn1, InnerFn2, i)
`
这允许我将所有相关组件封装在一起,而不会有任何真正的损失。由于标准的python作用域,即使你没有在调用中将它们作为参数添加,var1和var2也可以在两个内部函数中读取。