Python 是否可以重新加载导入的词典?

Python 是否可以重新加载导入的词典?,python,unit-testing,pytest,python-importlib,Python,Unit Testing,Pytest,Python Importlib,从模块导入dict->\u dict['new\u key']=1-现在,另一个文件中的同一导入使用以前不存在的密钥导入\u dict。这是运行多个test*.py文件的pytest的问题,每个文件都发生了变异\u dict——例如,test\u b导入\u dict由test\u a修改 一种解决方法是在变异之前进行\u dict=copy.deepcopy(\u dict),但假设这不是所希望的importlib.reload(模块)将不会重新加载\u dict-也就是说,是否有任何方法确保

从模块导入dict
->
\u dict['new\u key']=1
-现在,另一个文件中的同一导入使用以前不存在的密钥导入
\u dict
。这是运行多个
test*.py
文件的
pytest
的问题,每个文件都发生了变异
\u dict
——例如,
test\u b
导入
\u dict
test\u a
修改

一种解决方法是在变异之前进行
\u dict=copy.deepcopy(\u dict)
,但假设这不是所希望的
importlib.reload(模块)
将不会重新加载
\u dict
-也就是说,是否有任何方法确保始终导入原始
模块。\u dict


示例(也可不使用pytest)

#配置s.py
_dict={'a':1,'b':2}
#non_test.py
从配置导入
类SomeClass():
定义初始化(self,a=None,b=None):
self.a=a或_dict['a']
self.b=b或_dict['b']
del_dict['a']
#测试a.py
def测试_类():
SomeClass()
测试
def测试_类():
SomeClass()
每个
test*.py
都有以下“页眉”和“页脚”:

导入pytest
从非测试导入SomeClass
#测试*()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
pytest.main([\uuuuu文件\,“-s”])

注意:这个示例并没有反映实际的上下文,在这个上下文中,我的灵活性要小得多。我不是在要求解决“问题”本身——我所要求的在问题的标题中是正确的。如果这是“不可能的”或者没有任何接近它的东西,那么这就是答案。

您可以使用该函数重新加载模块。由于
配置中的
\u dict
被导入模块
非测试
,然后该模块被导入
测试b
,因此您应该重新加载
非测试
配置
,以便能够重新实例化新的
配置。\u dict
并将其重新导入
非测试

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

def test_class():
    SomeClass()

演示:

听起来像是“dict应该是一个类,然后可以多次实例化”。@rdas这不是一个要求-它是
pytest
有效地运行多个
\uuuu main\uuuu
的结果,而实际上只有一个。@SiHa使用一个类来存放字典是用户端的不便之处,似乎是对课程的滥用;其想法是将配置存储为DICT,可在内部和由用户导入。我不确定是否有多个
\uuuuu main\uuuuu
正在执行,否则您不会看到这种情况发生。有一个单独的
\u dict
浮动,由
sys.modules
缓存,我想您可能需要的是一个函数,将配置dict返回给每个模块,然后相应地修改。通过这种方式,您可以拥有任意数量的dict,而不必显式地
deepcopy
每一个(尽管这是重新生成dict,但您希望查看它)错误。。。这是怎么回事。我会仔细检查,但同时不确定如何解释:“如果一个模块使用from…import…(从…导入…)从另一个模块导入对象,那么为另一个模块调用reload()不会重新定义从它导入的对象”这不是说
重新加载(配置)
不会重新定义
\u dict
?哦,我想我知道为什么这对我来说是失败的-我会用一个更准确的例子来更新这个问题。它是说,如果
\u dict
不是直接在正在重新加载的模块中定义的,而是从另一个模块导入的,那么重新加载模块将无助于重新定义
\u dict
。换句话说,您应该始终重新加载定义
\u dict
的实际模块。重要的是要认识到
\u dict
只是内存中导入对象的参考点。i、 e.
从configs import\u dict
可能有一个
id(\u dict)
58907024
,随后每次尝试导入
\u dict
都会引用回相同的对象id。也就是说,直到
importlib.reload(configs)
被调用-现有的
\u dict
仍将指向
id
58907024
,但是
config.\u dict
现在将有一个新id,并且
从configs import作为新的\u dict
将使
新的\u dict
也成为一个新的对象引用。啊,够有意义了-抽象的Python正在运行。我最终决定使用
deepcopy
,因为我知道用户可能不可避免地会复制这些内容,但我仍然很高兴知道如何在模块中实际重新加载对象-谢谢。