4

2 つの自己定義パッケージpac1pac2. 以前は、すべてのモジュールを 1 つずつインポートし、変更後に 1 つずつリロードしていました。次のようにします。

from pac1 import mod1
from pac1 import mod2
from pac1 import mod3
from pac2 import mod4
from pac2 import mod5

reload(mod1)
reload(mod2)
reload(mod3)
reload(mod4)
reload(mod5)

ここで、モジュールをバッチ インポートし、コードを次のように改善できることを学びました。

from pac1 import *
from pac2 import *

reload(mod1)
reload(mod2)
reload(mod3)
reload(mod4)
reload(mod5)

しかし、これは私ができる最善のことですか?一度にすべてのパッケージをリロードできますか?

UPDATE1 : 私は常にこれらのモジュールを変更しています。したがって、テストの開始時にそれらをインポートした後、変更を反映するために、変更されたモジュールを頻繁にリロードする必要がある場合があります。これは、私がモジュールをリロードするインセンティブです。

UPDATE2 : このプロセスは必ずしも動的に行われるわけではありません。これらすべてを 1 つに融合して、コードをより簡潔にしたいだけですreload()

4

3 に答える 3

1

モジュールのグローバル リストがありますsys.modules(実際、これは dict です)。グローバル名前空間にあるすべてのモジュールをリロードしたい場合は、これを試してください:

import sys,imp
def reloader(globaldict):
    reloadkeys = set(globaldict)&set(sys.modules)
    for key in reloadkeys:
        if imp.is_builtin(key) == 0:
            reload(sys.modules[key])

reloader(locals())

または、自分で追跡したい場合は、独自のモジュールのリストを作成mymodulesし、インポート後に各モジュールを追加します。次に、ループを使用してそれぞれをリロードできます。


調べずにビルトインのリロードを回避する方法は次のglobalsとおりです。

import sys,imp
def reloader(globaldict):
    for key in sys.modules:
        if imp.is_builtin(key) == 0:
           reload(sys.modules[key])

sys.modulesまた、インタープリターを開始した直後の状態をキャプチャし、同様のブール演算を使用してそれらをリロードから除外することもできます。

于 2013-10-15T15:09:52.177 に答える
0

あなたはこのようなことを試すかもしれません

または、 Werkzeug (Flask) がどのようにそれを行うかを調べることもできます。これは、それ自体を呼び出すために使用するように見えるsubprocessか、とにかくコードの主要部分です。

于 2013-10-15T15:01:44.247 に答える
-1

それらを本当にリロードする必要があると仮定すると、明示的であるため、実行している方法が最適です(明示的は暗黙的よりも優れています)。何が起こっているのかを明確にします (特に、これは通常の状況ではないため)。

本当に動的に行う必要がある場合は、次のようなことを試すことができます。

import types

for k, v in globals().items():
    if not (k.startswith('__') and k.endswith('__')):
        if isinstance(v, types.ModuleType):
            reload(v)
于 2013-10-15T15:02:57.673 に答える