これは、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。
なぜですか?これは、問題自体ではなく、あなたが望むソリューションを記述しているようなものです。私が推測する危険を冒さなければならない場合は、次にコードを実行するためにオブジェクトの状態を保持しようとしています。これは、オブジェクトをJSON形式にシリアル化してファイルに保存する完璧な状況です。その後、コードが再び実行されると、ファイルからデシリアライズするだけです。 – Aaron3468
さて、そうかもしれません。 問題 - テンプレートモデル、フォーム、テンプレート、ビュー、URLを生成することで、簡単なジャンゴページの開発をスピードアップしたい。 問題はdjangoのURLを変更することです。それはリストです。だから私はファイルの最後に書くことはできません。 – Vladimir
'pickle'やJSONなどのシリアライズフォーマットを使用してください –