如何用Python AST模块程序化修改脚本中的属性赋值?
使用Python AST模块程序化修改代码的规范方案
要程序化修改Python代码,使用ast.NodeTransformer是最规范、可扩展的方案,比手动遍历节点简洁得多。针对你的需求,具体步骤如下:
核心思路
通过继承ast.NodeTransformer类,重写对应节点的处理方法,精准定位要修改的赋值语句,完成修改后再将AST转回代码字符串。
完整实现代码
import ast import astunparse # 若没有可通过pip install astunparse安装,Python3.9+也可用ast.unparse # 定义自定义节点转换器 class AssignmentModifier(ast.NodeTransformer): def visit_Assign(self, node): # 定位目标为self.x的赋值语句 if (len(node.targets) == 1 and isinstance(node.targets[0], ast.Attribute) and isinstance(node.targets[0].value, ast.Name) and node.targets[0].value.id == 'self' and node.targets[0].attr == 'x'): # 判断当前值是否为10,符合则修改为20 if isinstance(node.value, ast.Constant) and node.value.value == 10: node.value = ast.Constant(value=20) # 返回修改后的节点(或原节点) return node # 待处理的代码字符串 code_str = """import sys #Just any module class SomeClass: def __init__(self): self.x = 10 self.b = 15 def a_func(self): print(self.x) """ # 1. 解析代码为AST树 tree = ast.parse(code_str) # 2. 使用转换器修改AST modifier = AssignmentModifier() modified_tree = modifier.visit(tree) # 3. 修复缺失的位置信息(避免转代码时出错) ast.fix_missing_locations(modified_tree) # 4. 将AST转回代码字符串 modified_code = astunparse.unparse(modified_tree) # 或Python3.9+用ast.unparse(modified_tree) print(modified_code)
关键细节说明
ast.NodeTransformer会递归遍历所有AST节点,自动处理嵌套结构(比如类、函数内部的节点),无需手动多层循环遍历。- 精准判断节点类型:通过
isinstance检查目标是否为ast.Attribute(即属性赋值),且属性所属对象是self、属性名是x,同时值为10时才修改。 ast.fix_missing_locations必须调用,否则转换回代码时可能出现语法错误,它会给新创建的节点补充必要的位置信息。- 若使用Python3.9及以上版本,可直接用标准库的
ast.unparse替代第三方库astunparse。
输出结果
修改后的代码会将self.x = 10替换为self.x = 20,其余代码保持不变:
import sys #Just any module class SomeClass: def __init__(self): self.x = 20 self.b = 15 def a_func(self): print(self.x)
内容的提问来源于stack exchange,提问作者BTables
相关产品推荐
相关产品推荐

