Python 重新加载模块

6
我正在使用Python的unittest框架为一个名为“module”的python模块编写单元测试。
该模块在加载时使用JSON文件进行少量的“预处理”,因此具有可访问和使用的“module.info ['xyz']”等内容。
在编写此测试时,我希望在每个测试之前重新加载模块,以便在开始当前测试之前不再存在字典“module.info”的旧键。
目前,我在setUp()中使用reload(module),但似乎没有起作用。我仍然有由test_A引入的旧键,这些旧键在执行其他测试(如test_B和test_C)之后仍然存在。
我想知道是否有办法实现我所尝试的操作,或者您是否可以指向说明无法完成此操作的文档。

请查看这里的讨论 https://dev59.com/knRC5IYBdhLWcg3wAcXU - Maxim Khesin
@MaximKhesin 在发布这个问题之前,我已经阅读了那个问题,你认为哪部分讨论回答了我的问题? - ffledgling
1个回答

2
手动从 sys.modules 字典中删除模块对我来说似乎有效。
import sys
import unittest
import myModule

class MyTest( unittest.TestCase ):
    def setUp( self ):
        global myModule
        myModule = __import__( 'path.to.myModule', globals(), locals(), [''], -1 )
        return

    def tearDown( self ):
        global myModule
        del sys.modules[myModule.__name__]
        return

你为什么在 setUp() 中使用 __import__() 而不是再次使用 import myModule?如果这是为了保持 myModule 在全局命名空间中,是否有一种更简单的方式,而不需要知道如何使用 __import__() - CivFan
此外,setUptearDown 中的 return 调用是多余的。如果执行未触发 return 调用而在结尾处结束,则方法和函数会隐含地返回 None - CivFan
我使用__import__()的原因是它可以接受在运行时提供的字符串变量。 return调用是多余的,但我喜欢使用它们作为函数结束的视觉提示。 - ChristopherC
1
在Python中,您可以使用以下语句而不是del sys.modules [myModule.__name __]reload(myModule)importlib.reload(myModule) - Matt Palmerlee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接