が、私はast.NodeTransformer
を使用してASTを横断してNone
で、すべての空のリストを置き換え、簡単なスクリプトを書きました:どのようにしてAST訪問者を中止し、元のノードを変更しないままにすることができますか? <code>ast</code>と<code>astor</code>ライブラリを使用して
import ast
import astor
class ListChanger(ast.NodeTransformer):
def visit_List(self, node):
if len(node.elts) > 0:
return ast.copy_location(node, node)
return ast.copy_location(ast.NameConstant(value=None), node)
x = ast.parse("""["A"]""")
ListChanger().visit(x)
print(astor.to_source(x))
y = ast.parse("""[]""")
ListChanger().visit(y)
print(astor.to_source(y))
をこれは正しく動作し、出力:
["A"]
None
しかし、リストが空であれば、私が関数から抜け出そうとしていた行は不明です。
return ast.copy_location(node, none)
return
と置き換えて、条件が満たされない場合にスクリプトをNone
に戻すと、ノードは変更されずに破棄され、ast.List
ノードが破棄されたため、最初のテストケースが空文字列に印刷されます。
私はこれが起こりたくないと思っていますが、私はast.copy_location(node, node)
を使っても間違っていると思います。ノードが変更されずに関数を終了する、またはvisit
関数がNone
を返す場合、ノードは変更されないように、ast.NodeTransformer
を設定する専用の関数はありますか? documentationから
- ドキュメントで見て考えていませんでした。ありがとうございました! –