如何中止AST访问者并保持原始节点不变?

时间:2016-04-14 19:14:06

标签: python python-3.4 abstract-syntax-tree

使用astastor库,我编写了一个使用ast.NodeTransformer遍历AST的简单脚本,并用None替换所有空列表:

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)似乎是错误的。是否存在保持节点不变并退出函数的专用函数,或者配置ast.NodeTransformer的方式,以便在visit函数返回None时,节点保持不变?

1 个答案:

答案 0 :(得分:1)

来自documentation

  

返回值可能是原始节点,在这种情况下不会发生替换。

所以而不是:

return ast.copy_location(node, none)

只是:

return node