2014-05-19 3 views
0

다른 모듈에서 호출 된 콜백을 포함하고 전역 변수에 액세스해야하는 프로그램을 작성하고 있습니다.
전역 변수에 할당 된 변경 사항은 원래 할당 만 볼 수있는 콜백 함수에는 나타나지 않습니다. 나는 다른 모듈에서 가져 오기 때문에 추측하고있다.
이 패턴을 작성하는 올바른 방법은 무엇입니까?

파이썬 전역 변수 및 콜백

첫 번째 모듈 :

# a.py 
from b import runb 

myGlobal=None 

def init(): 
    global myGlobal 
    myGlobal=1 

def callback(): 
    print myGlobal 

def main(): 
    init() 
    runb() 

if __name__=='__main__': 
    main() 

두 번째 모듈 :이 프로그램은 '1'인쇄를 기대하지만, 대신이 '없음'인쇄합니다

#b.py 
def runb(): 
    from a import callback 
    callback() 

편집 : init는 한 번만 호출 할 수 있습니다 (복잡한 프로그램의 단순화입니다)

+0

원형 의존성을 피하는 것이 가장 좋습니다. http://stackoverflow.com/questions/1556387/circular-import-dependency-in-python –

+0

@Scorpion_God :이 링크는 모듈이 아닌 패키지 간의 종속성을 설명합니다. 일반적으로 순환 종속성을 피하는 것이 가장 좋지만 때로는 대안이 좋지 않다는 것을 알고 있습니다. – Photon

답변

3

파이썬은 __main__으로 메인 모듈을 수입 "없음"을 인쇄하지 할 수있게 실행되지 않습니다. b.pya을 실제 이름으로 가져 오면 모듈의 새 인스턴스가 a이라는 이름으로로드됩니다. 각 인스턴스에는 고유 한 myGlobal이 있습니다.

하나의 해결책은 이것이다 :

#b.py 
def runb(): 
    from __main__ import callback 
    callback() 

또 다른 해결책은 새로운 메인 모듈을 만드는 것입니다. a을 가져오고 a.main()을 명시 적으로 호출하십시오.

+0

고마워, 그게 해결 됐어. – Photon

1

파일을 모듈로 가져올 때 main() 함수가 호출되지 않습니다. __name__ == "main"a.py이 직접 실행될 때만 true입니다. 하면 "수입 콜백에서"이 작업을 수행하는 경우

+0

하지만 직접 a.py를 실행합니다. – Photon

+1

... 사실이 아니기 때문에 패키지의'__init __. py' 스크립트와 혼동했습니다. 죄송합니다. – jasal

+0

@Photon 스크립트 호출 방법을 보여줄 수 있습니까? – jasal

2

는 다시 "myglobal을 = 없음"은

+0

초기화없이 전역을 정의 할 수 있습니까? 그게 속임수일까요? 그렇다면 어떻게? – Photon