2

I have a python module_A which is doing something like this:

myvar = "Hello"

def message():
    print myvar

From another module, I want to import the function message:

from module_A import message

But this is defining myvar, which I do not want (for reasons not really relevant here). I guess what I need is to make a distinction between importing things from a module, and using any of the imported symbols. I actually want myvar to be initialized only when I use message.

I there any kind of python hook that I could use to initialize stuff whenever a function or class is accessed? I would like something similar to the following:

module_setup_done = False
def setup():
    global module_setup_done, myvar
    if not module_setup_done:
        myvar = "Hello"
        module_setup_done = True

def message():
    setup()
    print myvar

But, to reduce clutter, I would like this to be called automatically, something like this:

def _init_module():
    global myvar
    myvar = "Hello"

def message():
    print myvar

Where _init_module() would be called only once, and only the first time that something in the module is accessed, not when something is imported.

Is there support for this kind of pattern in python?

4

1 に答える 1

4

いいえ、これに対する組み込みのサポートはありません。モジュールのインポートとは別に何かを初期化したい場合は、その初期化を行う関数を作成し、それらを初期化したいときにその関数を呼び出します。他のものが呼び出されたときに「自動的に」初期化する場合は、既に投稿した行に沿ったコードで自分で処理する必要があります。

しかし、あなたがそれをしていることに気付いた場合、あなたはおそらく非pythonicなことをしているでしょう. ここでそれを行っている理由については詳しく説明しませんが、一般に、この種の暗黙的な初期化は Python では適切な方法ではありません。たとえば、モジュールをインポートしたり、ある種の初期化関数を呼び出したりして、明示的に指示すると、物事は初期化されます。この別個の暗黙的な初期化ステップが必要だと感じるのはなぜですか?

于 2012-10-11T05:36:03.107 に答える