4

たとえば、Python ASTツリーで使用したい「Something」というノードを作成する場合、それを行うには、Pythonソースコードにどこでどの変更を追加する必要がありますか?

AST文法が定義されているPython.asdlから始めるべきだと私は知っています。次に、ast.cに移動する必要があります。

残念ながら、ノードを実装するためにast.cファイルのどこに変更を加える必要があるのか​​正確にはわかりません。

また、簡単にするために、ノードをプレースホルダーとして使用したい場合を考えてみましょう。つまり、ノードは、ツリーに挿入できる以外は何も実行しないでください。

4

1 に答える 1

1

まだ飛び込む必要はありませPython.asdlん!次に、ASDLパーサーを探し回ってから、それをどうするかを理解する必要があります(ただし、これはそれ自体が価値のある演習です)。astすばらしいモジュールのおかげで、Python内にとどまることができます。

この問題に関するEliBenderskyの記事を必ずチェックしてください。

evalこれは、ASTが構築され、ゼロから作成された場所で彼が提供する例です。

import ast

node = ast.Expression(ast.BinOp(
                ast.Str('xy'),
                ast.Mult(),
                ast.Num(3)))

fixed = ast.fix_missing_locations(node)

codeobj = compile(fixed, '<string>', 'eval')
print eval(codeobj)

ast.NodeTransformer

ast.NodeTransformer既存のASTを変換する場合は、クラスを確認してください。

これは、上記のブログ投稿の例で、文字列値の先頭に。を追加するように変更していますstr:

class MyTransformer(ast.NodeTransformer):
    def visit_Str(self, node):
        return ast.Str('str: ' + node.s)
于 2012-02-08T09:48:36.623 に答える