可以重新加载导入的词典吗?
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_test
和 configs
能够重新实例化一个新的 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()
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_test
和 configs
能够重新实例化一个新的 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()