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
,因为我知道用户可能不可避免地会复制这些内容,但我仍然很高兴知道如何在模块中实际重新加载对象-谢谢。