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

に式をフィードしcompile、AST を調べて、必要なものをインポートできますか? ただし、AST を使用したことはありませんが、その例はありますか?

ここではセキュリティには関心がないことに注意してください。

4

2 に答える 2

1

データに完全な Python (JSON や YAML などのより簡単に解析できるものではなく) を使用することに慣れている場合、AST をたどることはかなり実現可能に思えます。ast.NodeVisitorを実装し、アクセスした属性ノードを追跡する必要があります。

于 2012-12-14T10:58:29.887 に答える
1

なぜこれに使用pickleしないのですか?__getstate__クラスのメソッドを使用して、シリアル化と__setstate__インスタンス化の側面を制御することもできます。自分のeval()ことをするよりも真剣に良いようです。

それ以外の場合、シリアライゼーション形式の値はどのように制御されていますか? つまり、どのモジュールが必要になるかを予測できるかもしれません。

于 2012-12-14T10:48:04.623 に答える