我想使用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,有什么例子吗?
注意我对这里的安全性不感兴趣。