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

Python提取可编译文件函数名,忽略注释行遇实现难题

嘿,我来帮你搞定这个提取Python函数名的问题!

先说说你现有代码的问题

你目前的代码只完成了判断文件是否可编译的第一步,还没实现提取函数名的核心逻辑,而且手动处理注释很容易踩坑——比如单行注释、多行注释、甚至字符串里的#都会干扰你的判断,这也是你之前要么把注释里的内容算进去,要么写出无限循环的原因。

更可靠的解决方案:用AST模块

与其自己写逻辑过滤注释和识别函数,不如用Python官方的ast模块——它能直接解析代码的抽象语法树,自动忽略所有注释,还能准确识别真正的函数定义(包括普通函数和异步函数),完全不会把注释或字符串里的伪代码当成函数。

完整代码示例

import py_compile
import ast

def is_compilable_python_file(file_path):
    """判断给定文件是否是可编译的Python文件"""
    try:
        # doraise=True 让编译错误直接抛出,方便捕获和提示
        py_compile.compile(file_path, doraise=True)
        return True
    except py_compile.PyCompileError as e:
        print(f"{file_path} 无法编译:{e.msg}")
        return False

def extract_function_names(file_path):
    """从可编译的Python文件中提取所有函数名,忽略注释"""
    # 先检查文件是否可编译
    if not is_compilable_python_file(file_path):
        return []
    
    # 读取文件内容
    with open(file_path, 'r', encoding='utf-8') as f:
        code_content = f.read()
    
    # 解析代码为抽象语法树
    try:
        tree = ast.parse(code_content)
    except SyntaxError as e:
        print(f"解析文件时出错:{e.msg}")
        return []
    
    function_names = []
    # 遍历语法树,提取函数名
    for node in ast.walk(tree):
        if isinstance(node, ast.FunctionDef):
            # 处理普通函数
            function_names.append(node.name)
        elif isinstance(node, ast.AsyncFunctionDef):
            # 处理异步函数
            function_names.append(node.name)
    
    return function_names

# 测试示例
if __name__ == "__main__":
    target_file = "your_script.py"  # 替换成你的目标文件路径
    extracted_funcs = extract_function_names(target_file)
    print(f"提取到的函数名:{extracted_funcs}")

代码解释

  1. is_compilable_python_file函数:优化了你原来的编译判断逻辑,用doraise=True让编译错误直接抛出,错误提示更清晰。
  2. extract_function_names函数:
    • 先检查文件是否可编译,不可编译直接返回空列表
    • 读取文件内容后用ast.parse解析成语法树,这一步会自动忽略所有注释
    • 遍历语法树节点,识别FunctionDef(普通函数)和AsyncFunctionDef(异步函数)节点,提取它们的名称
  3. 这个方法完全避免了手动处理注释的麻烦,也不会出现无限循环的问题——因为AST是基于语法规则解析,不是靠容易出错的正则或循环逻辑。

内容的提问来源于stack exchange,提问作者cejotaTP

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:06:27