3

python モジュールを sys.modules から一時的に削除して、テスト ケースの一部としてインポートし (さまざまなシステム関数をモック化して)、元に戻そうとしています。(はい、それは少しクレイジーです。代わりにコードを再構築することになるかもしれませんが、今は興味があります...)

モジュールを削除して再インポートすることはできますが、完了したら元のモジュールに戻すことができないようです。(たぶん、それは不可能なのでしょうか?) このアイデアをテストするために私が書いたテスト ケースを次に示します。

class Test(unittest.TestCase):

    def test_assumptions(self):
        import meta.common.fileutils as fu1
        del(sys.modules["meta.common.fileutils"])
        import meta.common.fileutils
        del(sys.modules["meta.common.fileutils"])
        sys.modules["meta.common.fileutils"] = fu1 # I hoped this would set the module back
        import meta.common.fileutils as fu2
        self.assertEqual(fu1, fu2)  # assert fails, fu2 is a new copy of module :-(

失敗する理由を誰かが提案できますか?

編集、回答の1つで提案されているように pop() を使用しても失敗します:

class Test(unittest.TestCase):

    def test_assumptions(self):
        import meta.common.fileutils as fu1
        orig = sys.modules.pop("meta.common.fileutils")
        import meta.common.fileutils
        del(sys.modules["meta.common.fileutils"])
        sys.modules["meta.common.fileutils"] = orig 
        import meta.common.fileutils as fu2
        self.assertEqual(fu1, orig) # passes
        self.assertEqual(fu2, orig) # fails
        self.assertEqual(fu1, fu2)  # fails
4

2 に答える 2

3

sys.modules構造は実際には単なるPython ですdictそこからモジュールを削除したり、に戻すこともできます。

元のモジュール オブジェクトをローカル変数に格納し、dict.pop()モジュールを削除して返すために使用します。

orig = sys.modules.pop('meta.common.fileutils')

次に、それを復元するときは、そのオブジェクトを に戻しますsys.modules

sys.modules['meta.common.fileutils'] = orig
于 2013-05-10T20:10:16.123 に答える