使用ast
和astor
库,我编写了一个简单的脚本,该脚本使用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
时,节点保持不变? 最佳答案
从documentation:
返回值可能是原始节点,在这种情况下不会发生替换。
所以代替:
return ast.copy_location(node, none)
只是:
return node
关于python - 如何中止AST访问者并使原节点保持不变?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36631989/