Python:访问嵌套函数中的所有父变量

时间:2014-07-11 14:39:08

标签: python scope

在我必须执行此操作的少数情况下,我使用了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() 

3 个答案:

答案 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也可以在两个内部函数中读取。