You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Python ast.NodeTransformer修改多节点时参数未变更的问题

问题原因与解决方案

你的问题出在没有在visit_FunctionDef中调用generic_visit方法——ast.NodeTransformer不会自动递归处理子节点,除非你显式触发。当你只修改函数名就返回节点时,参数列表里的arg节点根本没机会被visit_arg方法处理,所以参数名自然不会变。

修改后的转换器代码

import ast
import astor

class MyRenamer(ast.NodeTransformer):
    def __init__(self):
        self._arg_count = 0

    def visit_FunctionDef(self, node):
        # 关键:先递归处理所有子节点(包括参数列表中的arg节点)
        node = self.generic_visit(node)
        # 再修改函数名
        node.name = "method_name"
        return node

    def visit_arg(self, node):
        node.arg = f"arg_{self._arg_count}"
        self._arg_count += 1
        return node

# 测试代码
code = "def foo(my_input): return my_input + 42"
node = ast.parse(code)
renamer = MyRenamer()
node2 = renamer.visit(node)
print(astor.to_source(node2))

为什么这样有效?

generic_visit(node)会遍历当前节点的所有子节点(比如函数定义的args属性,也就是参数列表),并自动调用对应类型的visit_*方法。这样参数列表里的每个arg节点都会被visit_arg捕获,完成参数名的修改。

额外注意点

如果你要处理多个函数,可能需要在visit_FunctionDef开头重置_arg_count,避免参数编号在不同函数之间累加:

def visit_FunctionDef(self, node):
    self._arg_count = 0  # 重置计数器
    node = self.generic_visit(node)
    node.name = "method_name"
    return node

内容的提问来源于stack exchange,提问作者Jayendra Parmar

火山引擎 最新活动