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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 20:24:04