2017-04-23 3 views
0

修正されたPythonオブジェクトをソースにダンプする必要があります。私を助けてくださいPythonオブジェクトをPython AST-nodeに変換する

import ast 
import importlib 

import astor 


m = importlib.import_module('something') 

# modify an object 
m.VAR.append(123) 

ast_nodes = some_magic(m) 

source = astor.dump(ast_nodes) 

:だから私は、Pythonのast.Node(ソースをダンプするために、後でastor libに使用する)私が欲しいの使用、Pythonの2の

例に実際のPythonオブジェクトを変換するために何かを探してみますそれを見つけるにはsome_magic

+1

なぜですか?これは、問題自体ではなく、あなたが望むソリューションを記述しているようなものです。私が推測する危険を冒さなければならない場合は、次にコードを実行するためにオブジェクトの状態を保持しようとしています。これは、オブジェクトをJSON形式にシリアル化してファイルに保存する完璧な状況です。その後、コードが再び実行されると、ファイルからデシリアライズするだけです。 – Aaron3468

+0

さて、そうかもしれません。 問題 - テンプレートモデル、フォーム、テンプレート、ビュー、URLを生成することで、簡単なジャンゴページの開発をスピードアップしたい。 問題はdjangoのURLを変更することです。それはリストです。だから私はファイルの最後に書くことはできません。 – Vladimir

+0

'pickle'やJSONなどのシリアライズフォーマットを使用してください –

答えて

1

これは、ASTの仕組みではないので、あなたがしたいことをする方法はありません。 インタプリタがコードを実行すると、ソースファイルからASTが生成され、と解釈し、ASTはPythonオブジェクトを生成します。 生成されたオブジェクトには、ASTとは何の関係もありません。

しかし、最初にオブジェクトを生成したもののASTを取得することは可能です。

import ast 
import importlib 
import inspect 

m = importlib.import_module('pprint') 
s = inspect.getsource(m) 
a = ast.parse(s) 
print(ast.dump(a)) 
# Prints the AST of the pprint module 

しかしgetsource()が適切に命名される: モジュールinspectはあなたには、いくつかのPythonオブジェクトのソースコードを取得することができます。 mの変数(または他のオブジェクト)の値を変更すると、ソースコードが変更されません。

オブジェクトからASTを再生することができたとしても、単一の解決策はありません。some_magic()が返されます。ウェル(

# In some_module.py 
x = 0 

# In __main__.py 
m = importlib.import_module('some_module') 
m.x = 1 + 227 

さて、m.xの値が228ですが、その値につながった表現の種類を知る方法はありません: 私は別のモジュールに再割り当てすることを、私はいくつかのモジュール内の変数x持って想像してみて、__main__.pyのASTを読むことなく、これはすぐに手を抜くだろう)。単なるリテラルですか?関数呼び出しの結果は?

モジュールの値を変更した後で実際に新しいASTを取得する必要がある場合は、元のASTを自分で変換するのが最善の方法です。 あなたの識別子がどこに値を持っているのかを知ることができ、割り当ての値をあなたが望むものに置き換えることができます。例えば 、私の小さな例ではx = 0は、以下のASTで表される。

Assign(targets=[Name(id='x', ctx=Store())], value=Num(n=0)) 

そして、私は__main__.pyで行った再割り当てを一致ASTを得るために、私は上記のようAssignノードの値を変更する必要があります次

value=BinOp(left=Num(n=1), op=Add(), right=Num(n=227)) 

あなたがそのように行きたい場合は、私はあなたがASTノードトランス(ast.NodeTransformer)のPythonのドキュメントをチェックお勧めします、だけでなく、あなたがPythonで満たすことができるすべてのノードを文書化し、この優れたマニュアルAST Green Tree Snakes - the missing Python AST docs

関連する問題