我想使用eval
从文件加载对象。该对象将转储到文件中,以便它是一个有效的python表达式-所有类型均以其fqdn给出,如下所示:
mod1.Class1(
attr1=mod2.Class2(a=1,b=2),
attr2=[1,2,3,4],
attr3=mod1.submod1.Class3(),
)
当我将其输入
eval
时,并不是所有这些模块都在调用eval
的作用域中导入,因此对于顶层模块,我将得到NameError: name 'mod1' is not defined
,对于导入的模块,我将得到AttributeError: 'module' object has not attribute 'submod1'
。子模块。是否有一种优雅的方式来处理?我可以解析
NameError
,运行__import__
,然后重试eval
,但是我不知如何从AttributeError
中弄错。我可以将表达式输入
compile
,遍历AST并导入任何必需的内容吗?但是从未使用过AST,对此有任何示例吗?注意我对这里的安全性不感兴趣。
最佳答案
为什么不使用pickle
?您甚至可以在类上使用__getstate__
和__setstate__
方法来控制序列化和实例化的各个方面。似乎比做自己的eval()
事情要好得多。
否则,如何控制序列化格式中的值?即也许您可以预测将需要哪些模块。
关于python - 在eval(...)中自动导入所需的模块,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13876994/