我正在尝试从 sys.modules 中临时删除一个 python 模块,以便我可以将其作为测试用例的一部分导入(模拟出各种系统功能),然后再将其放回去。(是的,这有点疯狂,我可能最终会重组代码,但现在我很好奇......)
我可以删除模块并重新导入它就好了,但是一旦完成,我似乎无法将其放回原始模块。(也许那是不可能的?)这是我写的一个测试用例来测试这个想法:
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 :-(
谁能提出为什么它可能会失败?
编辑,按照答案之一的建议使用 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