我想使用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/

10-16 22:14