You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 12:35:19