当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python ast.NodeTransformer用法及代码示例


用法:

class ast.NodeTransformer

NodeVisitor 子类遍历抽象语法树并允许修改节点。

NodeTransformer 将遍历 AST 并使用访问者方法的返回值来替换或删除旧节点。如果访问者方法的返回值为 None ,则将节点从其位置移除,否则将其替换为返回值。返回值可能是原始节点,在这种情况下不会发生替换。

这是一个示例转换器,它将所有出现的名称查找(foo)重写为 data['foo']

class RewriteName(NodeTransformer):

    def visit_Name(self, node):
        return Subscript(
            value=Name(id='data', ctx=Load()),
            slice=Constant(value=node.id),
            ctx=node.ctx
        )

请记住,如果您正在操作的节点有子节点,您必须自己转换子节点或首先为节点调用generic_visit() 方法。

对于作为语句集合一部分的节点(适用于所有语句节点),访问者还可以返回节点列表而不仅仅是单个节点。

如果 NodeTransformer 引入新节点(不属于原始树的一部分)但未提供位置信息(例如 lineno ),则应使用新的 sub-tree 调用 fix_missing_locations() 以重新计算位置信息:

tree = ast.parse('foo', mode='eval')
new_tree = fix_missing_locations(RewriteName().visit(tree))

通常你像这样使用转换器:

node = YourTransformer().visit(node)

相关用法


注:本文由纯净天空筛选整理自python.org大神的英文原创作品 ast.NodeTransformer。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。