如何使用Python AST模块获取赋值节点的目标和值并过滤调用对象
实现方案
直接通过Python内置ast模块遍历语法树节点筛选即可,完整可运行代码如下:
import ast # 示例源码,若需读取本地py文件替换为文件读取逻辑即可 source_code = """ def isMaskedArray(x): ... isarray = isMaskedArray masked_array = MaskedArray _ShapeType = TypeVar("_ShapeType", bound=Any) """ # 解析源码生成抽象语法树 tree = ast.parse(source_code) result = [] for node in tree.body: # 仅处理赋值类型节点 if not isinstance(node, ast.Assign): continue # 过滤值为调用对象的赋值 if isinstance(node.value, ast.Call): continue # 提取赋值目标名和对应值 for target in node.targets: if isinstance(target, ast.Name): var_name = target.id # 此处适配值为普通变量引用的场景,需要支持常量、属性等类型可自行扩展判断分支 if isinstance(node.value, ast.Name): var_value = node.value.id result.append({var_name: var_value}) print(result)
运行后输出和需求完全匹配的结果:
[{'isarray': 'isMaskedArray'}, {'masked_array': 'MaskedArray'}]
关键逻辑说明
ast.parse()负责将字符串形式的Python代码转换为结构化的抽象语法树- 用
isinstance()判断节点类型,精准筛选Assign赋值节点 - 对赋值节点的
value属性做类型判断,直接过滤掉类型为Call的赋值,也就是你需要排除的函数调用类赋值 - 如果需要处理多目标赋值、常量赋值、属性赋值等其他场景,扩展对应节点类型的判断分支即可
如果需要解析本地Python文件,替换source_code的赋值逻辑即可:
with open("目标文件路径.py", "r", encoding="utf-8") as f: source_code = f.read()
内容的提问来源于stack exchange,提问作者Zysora
相关产品推荐
相关产品推荐

