Pythonいじり2
今朝の出勤電車ここまではできるようになった
>>> pprintast.build(_mod) ===== AST ===== <_ast.Interactive object at 0x100606690> ===== END AST ===== (Interactive (Expr (Call (Attribute (Name (Load)) (Load)) (Name (Load)))))
Python側で_astを見やすく表示するモジュールを作るという選択肢。
しかしまだNameとかの具体的な値が表示されていない。あとで作る。
PyRun_SimpleString("import pprintast;reload(pprintast); print pprintast.build(_mod)");
って書き換えたので、Pythonで書いた表示モジュールを書き換えつつ対話的にそれをテストできる。
>>> a = 1 ===== AST ===== (Interactive (Assign (Name['a'] (Store)) (Num[1]))) ===== END AST =====
なかなかいい感じ。もっと大きな例。
>>> def build(node): ... return Node(node.__class__.__name__, ... [build(c) for c in ast.iter_child_nodes(node)], ... node) ... ===== AST ===== (Interactive (FunctionDef (arguments[] (Name['node'] (Param))) (Return[] (Call (Name['Node'] (Load)) (Attribute['__name__'] (Attribute['__class__'] (Name['node'] (Load)) (Load)) (Load)) (ListComp[] (Call (Name['build'] (Load)) (Name['c'] (Load))) (comprehension[] (Name['c'] (Store)) (Call (Attribute['iter_child_nodes'] (Name['ast'] (Load)) (Load)) (Name['node'] (Load))))) (Name['node'] (Load))))))
S式(になりきれてないけど最終的にはなる予定)をきれいに改行&インデントするライブラリとかすでに誰かがつくってそうだなぁ。