首页Python【Python内置函数】b...

【Python内置函数】breakpoint()函数

Python 提供了许多内置函数,这些函数是Python语言的一部分,可以直接在Python程序中使用而无需导入任何模块。

本系列将会陆续整理分享一些的Python内置函数。

文章配套代码获取有以下两种途径:
  • 通过百度网盘获取:
链接:https://pan.baidu.com/s/11x9_wCZ3yiYOe5nVcRk2CQ?pwd=mnsj 提取码:mnsj
  • 前往GitHub获取
https://github.com/returu/Python_built-in_functions





01
简介

breakpoint() 函数是 Python 3.7 引入的一个内置函数,用于在代码执行过程中设置一个断点。当程序运行到这个函数时,会暂停执行并进入调试模式,允许开发者检查程序的当前状态,比如变量的值、调用栈等。

在调试器中,可以执行各种命令来检查程序的当前状态,比如:

  • n(next):执行下一行代码;

  • c(continue):继续执行程序直到下一个断点或结束;
  • p variable:打印变量的值;
  • q(quit):退出调试器并终止程序。
breakpoint() 函数的基本语法如下:
breakpoint(*args, **kws)
参数说明:
*args 和 **kws:虽然该函数接受任意数量的位置参数和关键字参数,但在大多数情况下,并不需要传递任何参数。这些参数主要用于与调试器的交互,但在简单的使用场景中很少用到。
  • 工作原理

当调用 breakpoint() 函数时,它实际上会调用 sys.breakpointhook() 函数,并将任何传递给 breakpoint() 的参数和关键字参数直接传递给 sys.breakpointhook()

默认情况下,sys.breakpointhook() 会调用 pdb.set_trace(),并且不接受任何参数。这意味着在没有自定义的情况下,breakpoint() 将启动 Python 的标准调试器 pdb 并在调用 breakpoint() 的位置暂停程序执行。

  • 自定义行为

可以通过设置 sys.breakpointhook() 为其他函数来自定义 breakpoint() 的行为。此时,当调用 breakpoint() 时,它会自动调用你指定的函数,从而允许使用自定义的调试器。

另外,还可以通过设置环境变量 PYTHONBREAKPOINT 来改变 breakpoint() 的默认行为。例如,设置 PYTHONBREAKPOINT=0 可以禁用 breakpoint() 的默认行为,使其不启动调试器。

  • 异常处理

如果 sys.breakpointhook() 不可访问,breakpoint() 函数将引发 RuntimeError

02
使用

下面是一些使用 breakpoint() 函数的示例:

  • 示例 1:基本使用

可以在代码中任何位置插入 breakpoint(),当程序运行到这里时,会暂停并进入调试模式。例如:

def foo():
    a = 1
    b = 2
    breakpoint()  # 在这里设置断点
    c = a + b
    return c

foo()

需要注意的是,在 Jupyter Notebook 中使用 breakpoint() 函数的行为与在标准 Python 脚本中有所不同。Jupyter Notebook 的交互式环境和内核管理方式导致 breakpoint() 不会像在命令行脚本中那样直接启动调试器 pdb

如果希望在Jupyter Notebook中进行调试,可以在代码中显式调用pdb.set_trace()来设置断点:

import pdb

def foo():
    a = 1
    b = 2
    pdb.set_trace()  # 手动设置断点
    c = a + b
    return c

foo()


  • 示例 2:自定义调试器

可以通过设置 sys.breakpointhook 来指定一个自定义的调试器函数。

在下面的代码中添加了如下的自定义调试逻辑:

  • 导入 inspect 模块:inspect 模块提供了许多有用的函数,可以用来获取当前调用栈的信息,包括当前帧(frame)。

  • 获取当前调用栈的帧信息:inspect.currentframe().f_back 获取当前帧的上一个帧,即调用 breakpoint() 的帧。
  • 打印局部变量:frame.f_locals 包含了当前帧的局部变量。通过遍历 frame.f_locals,可以打印出所有局部变量的名称和值。
  • 打印当前函数的名称:frame.f_code.co_name 获取当前帧的函数名称。
  • 检查变量的类型:通过检查 frame.f_locals 中的变量,可以打印出特定变量的类型。
  • 暂停执行并等待用户输入:使用 input(“Press Enter to continue…”) 暂停执行,等待用户输入,这可以让用户在调试时有机会检查变量的值或进行其他操作。
import sys

def my_debug_hook(*args, **kwargs):
    print("Custom debugger hook called!")
    # 在这里添加自定义调试逻辑
    
    # 获取当前调用栈的帧信息
    import inspect
    frame = inspect.currentframe().f_back
    
    # 打印当前函数的局部变量
    print("Local variables in the calling frame:")
    for var_name, var_value in frame.f_locals.items():
        print(f"  {var_name} = {var_value}")
    
    # 打印当前函数的名称
    print(f"Current function: {frame.f_code.co_name}")
    
    # 执行一些简单的调试操作,例如检查变量的类型
    if'x'in frame.f_locals:
        print(f"Type of x: {type(frame.f_locals['x'])}")
    
    # 可以在这里添加更多的调试逻辑
    # 例如,暂停执行并等待用户输入
    input("Press Enter to continue...")

sys.breakpointhook = my_debug_hook

def example_function(x):
    y = x * 2
    breakpoint()  # 这将调用 my_debug_hook 而不是默认的调试器
    return y

result = example_function(5)
print(result)
输出结果如下所示:
Custom debugger hook called!
Local variables in the calling frame:
  x = 5
  y = 10
Current function: example_function
Type of x: <class 'int'>
Press Enter to continue...


本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments