簡體   English   中英

Python:訪問嵌套函數中的所有父變量

[英]Python: Access all Parent Variables in Nested Function

在少數情況下,我不得不使用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() 

跟蹤相似變量的另一種方法是將它們放在類中。 例如:

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()

更改函數以使用參數,並從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) 

等等

我有一個調用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以便進行讀取。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM