4

私が実行している各単体テストは、Python コードをファイルに書き込んでから、モジュールとしてインポートしています。問題は、コードが変更されても、それ以降の import ステートメントでモジュールが変更されないことです。

私が必要としているのは、モジュールのリロードを強制するか、内部のバイトコード キャッシュをクリアする方法だと思います。何か案は?

ありがとう!

4

4 に答える 4

8

モジュールの再インポートは、すべてのエッジ ケースを正しく行うのが難しい作業です。reloadのドキュメントには、それらのいくつかが記載されています。何をテストするかによっては、たとえばsubprocessを介してそれぞれを実行することにより、インタープリターの個別の呼び出しでインポートをテストする方が良い場合があります。遅くなる可能性がありますが、より安全で正確なテストになる可能性があります。

于 2011-01-12T01:25:43.130 に答える
4

を使用しreload()ます。

以前にインポートしたモジュールを再ロードします。引数はモジュール オブジェクトである必要があるため、以前に正常にインポートされている必要があります。これは、外部エディターを使用してモジュール ソース ファイルを編集し、Python インタープリターを離れずに新しいバージョンを試したい場合に便利です。戻り値はモジュール オブジェクトです (モジュールの引数と同じ)。

ただし、モジュールはすでにロードされている必要があります。回避策は、結果を処理することNameErrorです:

try:
    reload(math)
except NameError:
    import math
于 2011-01-12T01:05:54.097 に答える
3

別の名前のモジュールにコードを記述します。既存のファイルに新しいコードを書き込んで、それを再度インポートしようとすると、うまく機能しません。

または、clobberすることもできますsys.modules。例えば:

class MyTestCase(unittest.TestCase):
    def setUp(self):
        # Record sys.modules here so we can restore it in tearDown.
        self.old_modules = dict(sys.modules)

    def tearDown(self):
        # Remove any new modules imported during the test run. This lets us
        # import the same source files for more than one test.
        for m in [m for m in sys.modules if m not in self.old_modules]:
            del sys.modules[m]
于 2011-01-12T01:50:02.137 に答える