当前位置:首页 > Python > 正文

Python中显示代码行数的完整指南 | Python编程技巧

Python中显示代码行数的完整指南

为什么需要显示代码行数?

在编程中显示代码行数对于调试、错误定位和代码审查至关重要。当程序抛出异常时,Python通常会显示错误发生的行号,但在其他情况下,开发者可能需要主动显示代码行数来:

  • 追踪程序执行流程
  • 调试复杂逻辑
  • 分析代码结构
  • 生成代码文档
  • 进行代码审查

方法1:使用内置的inspect模块

Python的inspect模块提供获取源代码和行号的功能,特别适合在运行时检查代码。

示例:获取当前行号

import inspect

def get_current_line():
    return inspect.currentframe().f_back.f_lineno

print("当前行号:", get_current_line())  # 输出当前行号

示例:显示函数定义位置

import inspect

def example_function():
    frame = inspect.currentframe()
    print(f"函数定义在 {frame.f_code.co_filename} 文件的第 {frame.f_code.co_firstlineno} 行")

example_function()

方法2:读取文件时显示行号

当需要处理源代码文件时,可以逐行读取文件并添加行号:

def display_code_with_lines(filename):
    """显示带行号的源代码"""
    try:
        with open(filename, 'r', encoding='utf-8') as file:
            lines = file.readlines()
        
        # 确定行号最大宽度
        max_line_num_width = len(str(len(lines)))
        
        print(f"文件: {filename}\n")
        for i, line in enumerate(lines, 1):
            # 格式化行号并打印
            print(f"{i:{max_line_num_width}} | {line.rstrip()}")
    
    except FileNotFoundError:
        print(f"错误: 文件 {filename} 不存在")
    except Exception as e:
        print(f"读取文件时出错: {str(e)}")

# 示例用法
display_code_with_lines("example.py")

方法3:使用IDE/编辑器的行号功能

大多数现代Python开发环境都内置了行号显示功能:

PyCharm

启用行号: View → Appearance → Show Line Numbers

VS Code

启用行号: 设置中搜索 "line numbers" 并启用

Jupyter Notebook

启用行号: View → Toggle Line Numbers

其他编辑器

Sublime Text, Atom, Vim等编辑器也都有类似的行号显示功能,通常在视图或设置菜单中。

方法4:高级用法 - 自定义代码追踪器

创建自定义的代码追踪器来监控程序执行:

import sys
import linecache

class CodeTracer:
    def __init__(self):
        self.last_frame = None
    
    def trace_calls(self, frame, event, arg):
        if event != 'call':
            return
        
        # 获取函数名和行号
        func_name = frame.f_code.co_name
        line_no = frame.f_lineno
        filename = frame.f_code.co_filename
        
        # 获取源代码行
        line = linecache.getline(filename, line_no).strip()
        
        # 避免重复报告同一行
        if frame != self.last_frame:
            print(f"调用函数 '{func_name}' 在 {filename}:{line_no}")
            print(f"  代码: {line}")
            self.last_frame = frame
        
        return self.trace_calls

# 设置追踪器
tracer = CodeTracer()
sys.settrace(tracer.trace_calls)

# 测试函数
def calculate(a, b):
    result = a * b
    return result

def main():
    x = 10
    y = 20
    total = calculate(x, y)
    print(f"结果: {total}")

if __name__ == "__main__":
    main()

# 清除追踪
sys.settrace(None)

最佳实践与注意事项

  • 调试时优先使用IDE的行号功能,效率最高
  • 在生产环境中避免使用inspect模块,可能影响性能
  • 使用linecache模块可以高效读取源代码行
  • 异常处理时,Python会自动显示错误行号(traceback)
  • 代码审查工具如GitHub/GitLab也会显示行号
  • 考虑行号显示对日志大小的影响,必要时仅记录关键位置

发表评论