如何使用Python的ast.parse为同文件中定义的函数生成AST?
处理已定义函数的AST生成问题
ast.parse() 仅接受源代码字符串作为参数,直接传入函数对象会报错。要对同一文件中已定义的函数生成AST,有两种实用方法:
方法1:用inspect模块获取函数源代码
inspect.getsource() 可以直接提取函数的源代码文本,再传给ast.parse()解析,是最直接的方案:
import ast import inspect def foo(bar): print(bar) # 获取函数的源代码字符串 foo_source = inspect.getsource(foo) # 解析生成AST foo_ast = ast.parse(foo_source) # 打印AST结构(可选) print(ast.dump(foo_ast, indent=2))
注意:该方法要求函数是在可读取源码的环境中定义的(比如本地文件,而非交互式环境动态生成或编译后的字节码)。
方法2:解析整个文件的AST并筛选目标函数
如果需要处理多个函数或依赖文件上下文,可以读取当前文件的全部源码,解析整个文件的AST后,筛选出目标函数的节点:
import ast def foo(bar): print(bar) # 读取当前文件的全部源代码 with open(__file__, 'r', encoding='utf-8') as f: file_source = f.read() # 解析整个文件的AST file_ast = ast.parse(file_source) # 遍历AST找到名为foo的函数定义节点 foo_ast = None for node in ast.walk(file_ast): if isinstance(node, ast.FunctionDef) and node.name == 'foo': foo_ast = node break # 打印目标函数的AST结构(可选) if foo_ast: print(ast.dump(foo_ast, indent=2))
注意:__file__ 在Python交互式环境中可能无法正确指向文件路径,这种场景下更适合用方法1。
内容的提问来源于stack exchange,提问作者JRR
相关产品推荐
相关产品推荐

