无需运行代码,如何统计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
相关产品推荐
相关产品推荐

