1

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

我可以将表达式输入到compileAST 并导入任何必要的内容吗?从来没有使用过 AST,有什么例子吗?

注意我对这里的安全性感兴趣。

4

2 回答 2

1

如果你热衷于使用完整的 Python(而不是像 JSON 或 YAML 这样更容易解析的东西)来处理数据,那么走 AST 听起来相当可行。您想要实现ast.NodeVisitor并跟踪访问的 Attribute 节点。

于 2012-12-14T10:58:29.887 回答
1

为什么不pickle用于这个?您甚至可以__getstate____setstate__您的类上使用方法来控制序列化和实例化的各个方面。似乎比做自己的eval()事情要好得多。

否则,您的序列化格式中的值如何控制?即,也许您可​​以预测将需要哪些模块。

于 2012-12-14T10:48:04.623 回答