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式(になりきれてないけど最終的にはなる予定)をきれいに改行&インデントするライブラリとかすでに誰かがつくってそうだなぁ。