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() 
関連する問題