2014-07-11 3 views
1

몇 가지 경우에 나는 global 키워드를 사용했습니다. 현재 닫히지 않은 While 문 다음에 기본적으로 200 라인 인 일부 코드는 정리하고 있습니다. 모든 것을 기능적으로 작은 비트로 분리하고 싶습니다만 문제는 200 줄에 걸쳐 동일한 변수에 대한 많은 참조가 있다는 것입니다. 명시 적으로 선언하지 않고 모든 부모 변수에 중첩 된 함수 액세스 권한을 부여하는 방법이 있습니까?Python : 중첩 함수의 모든 부모 변수에 액세스

원래 정말 오래 동안 문 :

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

루프를 통해 매번 함수를 정의하면 많은 오버 헤드가 추가됩니다. 루프 외부에서 함수를 정의하고 필요한 데이터를 매개 변수로 전달하여 적절한 값을 반환합니다. – chepner

+0

관련 항목 : http://stackoverflow.com/a/24682708/3001761 – jonrsharpe

답변

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

매개 변수를 사용하도록 함수를 변경하고 그 동안 루프에서 함수를 가져옵니다. 예를 들어

:

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) 

+0

locals()를 다른 스코프로 전달하는 실제 효과적인 방법이 있습니까? – user3467349

+0

그 뜻을 확장 할 수 있습니까? – Scott

+0

클래스를 사용하면 관심있는 모든 변수를 하나의 객체로 "패키지화"합니다. 클래스 인스턴스를 다른 객체에 전달하면 속성에 액세스 할 수 있습니다. 마찬가지로 사전을 사용하여 동일한 작업을 수행하고이를 통과시켜 효과적으로 모든 변수를 유지할 수 있습니다. var_dict = { 'var1': x, 'var2': [], 'var3': {}, 'var4': 'y'} – Nick

0

I는 그 기능이 반복적으로 호출하는 다른 기능을 얻어 scipy.optimize.fmin_l_bfgs_b()를 호출하는 기능을 가지고있다. 나는 사용자가 선택할 수있는 다양한 최적화 방법을 사용하여이 동일한 기능의 여러 버전을 보유하고 있습니다.

모두 함께 유지하기 위해 나는 당신이 말하는 것을 수행하지만, 실제 인스턴스화 메서드 외부에서 루프를 수행해야합니다. 이 다음과 같아야 :

`데프 MethodOne (VAR1, VAR2) : 데프 InnerFn1 (...) : ... 데프 InnerFn2 (...) : ....

을 실제 위약금없이, 내가 함께 관련된 모든 구성 요소를 캡슐화 할 수 있습니다
for i in range(0, var1): 
    CallFunctionWhichCallsAnFnAbove(var2, InnerFn1, InnerFn2, i) 

`

. var1과 var2는 표준 파이썬 범위 지정으로 인해 내부 함수를 매개 변수로 추가하지 않더라도 내부 함수 모두에서 읽을 수 있습니다.

관련 문제