如何通过AST解析Python文件,无需运行即可提取类、基类及属性?
基于AST模块提取Python文件类信息的实现方案
可以直接通过解析AST节点结构实现需求,不需要加载运行目标文件,改进后的代码如下:
import ast def get_class_info(path): with open(path, 'r', encoding='utf-8') as fh: root = ast.parse(fh.read(), path) class_info_list = [] for node in ast.iter_child_nodes(root): if not isinstance(node, ast.ClassDef): continue # 提取基类列表 base_classes = [] for base in node.bases: if isinstance(base, ast.Name): base_classes.append(base.id) # 如需处理带模块前缀的基类(如xxx.BaseClass),可补充ast.Attribute类型的判断逻辑 # 提取类属性列表 class_attrs = [] for child in node.body: # 处理普通赋值的类属性 if isinstance(child, ast.Assign): for target in child.targets: if isinstance(target, ast.Name): class_attrs.append(target.id) # 处理带类型注解的类属性 elif isinstance(child, ast.AnnAssign): if isinstance(child.target, ast.Name): class_attrs.append(child.target.id) # 组装类信息 class_info_list.append({ "class_name": node.name, "base_classes": base_classes, "class_attributes": class_attrs }) return class_info_list # 测试调用 if __name__ == "__main__": for info in get_class_info('a.py'): print(f"类名:{info['class_name']}") print(f"基类列表:{info['base_classes']}") print(f"类属性列表:{info['class_attributes']}\n")
运行效果
针对你给出的a.py测试文件,运行后输出结果为:
类名:MyClass 基类列表:['UndefinedClass'] 类属性列表:['name']
该方案和你原有逻辑的优势一致,全程仅做静态语法解析,即使目标文件存在导入错误、未定义标识符等运行时问题,只要语法结构符合Python规范,就可以正常提取信息。
补充说明
- 如果需要提取实例属性(即
__init__方法里self.xxx = xxx定义的属性),可以额外遍历类下的FunctionDef节点,找到__init__方法,再解析内部的赋值语句中绑定到self的属性名即可。 - 如果基类是带模块路径的形式(比如
class A(lib.Parent)),可以补充对ast.Attribute类型节点的解析逻辑,拼接出完整的基类标识。
内容的提问来源于stack exchange,提问作者Edgar Navasardyan
相关产品推荐
相关产品推荐

