使用ast获取py文件中所有函数与类名
当我们在创建python项目,经常需要遍历和分析代码文件,特别是当我们想要自动化地获取某些信息,比如所有的函数和类名。Python的ast(Abstract Syntax Trees,抽象语法树)模块为我们提供了一个强大的工具,可以方便地解析Python源代码,并从中提取出我们需要的信息。
原理
当我们将py文件路径传递给ast模块的parse函数后,ast会将其解析为抽象语法树,然后使用ast.walk方法遍历这棵树,查找函数定义(FunctionDef节点)和类定义(ClassDef节点)。
每当我们遇到一个这样的节点时,就可以提取出对应的函数名或类名。这种方法不仅准确,而且比使用正则表达式等字符串处理方法更加可靠,因为它直接利用了Python的语法解析能力。此外,ast模块还可以帮助我们避免因为代码格式变化或注释等无关因素而导致的解析错误,因为它只关注语法结构,而不关心具体的代码风格或注释内容。
代码
ast是python内置库,因此我们不需要使用pip命令安装。
import ast
def extract_function_and_class_names(pyfile_path):with open(pyfile_path, 'r', encoding='utf-8') as f:source=f.read()try:tree=ast.parse(source, filename=pyfile_path)except SyntaxError:print(f"语法错误!")return []names=[]for node in ast.walk(tree):if isinstance(node, ast.FunctionDef):names.append(node.name)elif isinstance(node, ast.ClassDef):names.append(node.name)return names
运行结果:
使用上述代码对WechatAuto.py运行后:
说明
特别的,如果你的项目内函数或类比较多,又需要使用__all__=['函数名','类名']来限制用户在使用以下方式:
from module import *
导入你的模块后能够使用的函数或方法,那么你便可以先使用ast模块先将你的py脚本内的函数或类全部导出,然后再使用list comprehension将不需要的部分删除掉即可。