本系列将会陆续整理分享一些的Python内置函数。
-
通过百度网盘获取:
链接:https://pan.baidu.com/s/11x9_wCZ3yiYOe5nVcRk2CQ?pwd=mnsj
提取码:mnsj
-
前往GitHub获取:
https://github.com/returu/Python_built-in_functions
在调试器中,可以执行各种命令来检查程序的当前状态,比如:
-
n(next):执行下一行代码;
-
c(continue)
:继续执行程序直到下一个断点或结束;
-
p variable
:打印变量的值;
-
q(quit)
:退出调试器并终止程序。
breakpoint(*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。
下面是一些使用 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...


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