可以重新加载导入的词典吗?

Possible to reload imported dictionaries?

from module import _dict -> _dict['new_key'] = 1 - 现在,另一个文件中的相同导入导入 _dict 之前的 non-existent 键。这是运行多个 test*.py 文件的 pytest 的一个问题,每个文件都会发生变异 _dict - 例如test_b 导入由 test_a 修改的 _dict

变通方法是 _dict = copy.deepcopy(_dict) 在改变之前 - 但假设这不是我们想要的。 importlib.reload(module) 不会重新加载 _dict - 这就是说,有没有办法确保始终导入原始 module._dict


示例(也runnable code,没有pytest)。

# configs.py
_dict = {'a': 1, 'b': 2}
# non_test.py
from configs import _dict

class SomeClass():
   def __init__(self, a=None, b=None):
        self.a = a or _dict['a']
        self.b = b or _dict['b']
        del _dict['a']
# test_a.py
def test_class():
    SomeClass()
# test_b.py
def test_class():
    SomeClass()

每个 test*.py 有以下 'header' & 'footer':

import pytest
from non_test import SomeClass
# test_*()
if __name__ == '__main__':
    pytest.main([__file__, "-s"])

注意:这个例子并没有反映实际的上下文,在这种情况下我的灵活性要低得多。我不是在寻求 'the problem' 本身的解决方案 - 我所要求的在问题的标题中是正确的。如果它是 "impossible" 或者没有接近它的东西,那就是答案。

您可以使用importlib.reload 函数重新加载模块。由于 configs 中的 _dict 被导入模块 non_test,然后被导入 test_b,您应该重新加载 non_testconfigs能够重新实例化一个新的 configs._dict 并将其重新导入到 non_test:

# test_b.py
import non_test
import configs
import importlib
importlib.reload(non_test)
importlib.reload(configs)

def test_class():
    SomeClass()

演示:https://repl.it/@blhsing/SaneDesertedMode