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

无需运行代码,如何统计Python文件中各函数的代码行数?

统计Python函数代码行数(无需运行代码)

现成工具选项

  • radon:专门做代码度量的工具,直接支持统计单个/所有函数的代码行数,还能区分有效代码、空行、注释,完全不需要运行目标代码。安装后执行radon raw your_file.py就能看到详细结果。
  • pylint:通过其AST分析能力,可以获取函数的起始和结束行号,进而提取源码片段。你可以直接调用它的内部API实现定制化统计。
  • pycodestyle:虽主打代码风格检查,但同样能通过API提取函数的行范围信息,满足需求。

自行实现(基于AST,比正则更可靠)

正则很容易被Python复杂语法(如多行字符串、嵌套函数、装饰器)坑,用AST是更稳定的方案。Python 3.8+的AST节点自带lineno(函数定义起始行)和end_lineno(函数结束行)属性,结合文件内容就能提取源码并统计行数:

import ast

def extract_func_details(file_path):
    with open(file_path, 'r', encoding='utf-8') as f:
        source_lines = f.readlines()
        source_content = ''.join(source_lines)
        tree = ast.parse(source_content)

    func_details = []
    for node in ast.walk(tree):
        if isinstance(node, ast.FunctionDef):
            # 转换为列表索引(Python行号从1开始,列表从0开始)
            start_idx = node.lineno - 1
            end_idx = node.end_lineno
            # 提取函数源码
            func_source = ''.join(source_lines[start_idx:end_idx])
            # 统计有效代码行数(跳过空行和单行注释)
            valid_lines = 0
            for line in source_lines[start_idx:end_idx]:
                stripped_line = line.strip()
                if stripped_line and not stripped_line.startswith('#'):
                    valid_lines += 1
            func_details.append({
                'function_name': node.name,
                'start_line': node.lineno,
                'end_line': node.end_lineno,
                'total_lines': end_idx - start_idx,
                'valid_code_lines': valid_lines,
                'source_code': func_source
            })
    return func_details

# 调用示例
# for func in extract_func_details("your_script.py"):
#     print(f"函数: {func['function_name']},有效行数: {func['valid_code_lines']}")

如果使用Python 3.8之前的版本,AST节点没有end_lineno,可以用asttokens库(无需运行目标代码)获取精确行号范围,避免自己处理缩进逻辑的麻烦。

关于inspect的说明

你理解的没错,inspect需要导入目标模块(本质是运行代码)才能获取函数源码和行号,确实不适合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 06:54:07