2017-11-03 4 views
1

저는 Python을 배우고 간단한 채팅 봇을 만들고 있습니다.다른 모듈에서 변경된 변수에 액세스하십시오.

# bot.py 
class QueueWrapper: 
    pass 

wrapper = QueueWrapper() # also tried with dict 

def main(): 
    wrapper.queue = init_queue() 

if __name__ == '__main__': 
    main() 

그리고 내가 봇 모듈에서 queue에 액세스하려는 다른 모듈이 고려하지만, bot.py 모듈을 호출있어 후이 모듈의 기능은 시간이 호출됩니다 : 나는 주요 기능을 가진 모듈이 고려

# another_module.py 
from bot import wrapper 

def create_job(): 
    wrapper.queue.do_smth() # <- error. object has no attribute ... 

내가 wrapper 개체에 있어야 queue에 액세스하려고 할 때 내가 얻을 오류가 wrapper에는 queue이없는 말. 하지만 bot 모듈을 통해 디버그 모드로 실행하면 분명히 wrapper.queue에 객체가 있다는 것을 알 수 있습니다. 그러나 create_job 함수가 another_module.py에서 호출 될 경우 queuewrapper에 있음을 알 수 없습니다.

여기 내 생각에 문제는 main()init_queue()이 작업을 완료했지만 모듈 자체가 그 전에 another_module로 가져 도착 후 bot.py에서 VAR queue이 초기화됩니다 있다는 것입니다.

무엇이 잘못 되었습니까 (변수 범위에 대해 빠진 것일 수 있습니다) create_job()이 호출 될 때 wrapper.queue을 어떻게 초기화 할 수 있습니까?

미리 감사드립니다. queue 속성이 자동으로 초기화되도록이 처음 액세스 할 때

+1

__main __- 부분은 수입에 실행되지 않습니다. 'wrapper.queue = init_queue()'를 항상 설정하고 싶다면'wrapper = ... ' –

+0

...의 정의 아래에 배치하거나 QueueWrapper의'__init__' 메소드에 넣어야합니다. –

+0

내 대답을 시도 했습니까? 문제가 해결되지 않으면 이유를 설명해 주시면 개선하기 위해 노력하겠습니다. – ekhumoro

답변

0

당신은 property을 사용할 수

class QueueWrapper: 
    _queue = None 

    @property 
    def queue(self): 
     if self._queue is None: 
      self._queue = init_queue() 
     return self._queue 

wrapper = QueueWrapper()