Pythonsys
模块提供了一些强大的函数,但它们理解起来很复杂。其中之一是sys.settrace()
它用于实现调试器、分析器和覆盖工具。这是特定于线程的,必须使用threading.settrace()
。
如果您计划创建自己的调试器,了解函数内部的工作原理非常重要。
在更高的层次上,sys.settrace()
将回溯注册到 Python 解释器。回溯本质上是代码中发生事件时返回的信息。你可能见过traceback
当您的代码出现错误或引发异常时。
当以下四个事件之一发生时,将调用已注册的回溯:
- 函数被调用
- 函数返回
- 执行一条线
- 引发异常
用法: sys.settrace(frame, event, arg.frame)
参数:
frame:frame 是当前堆栈帧
event:一个字符串,可以是'call', 'line', 'return', 'exception'
或者'opcode'
arg:取决于事件类型
返回:对本地跟踪函数的引用,然后返回对自身的引用。
例:
让我们创建我们自己的本地跟踪函数line, function and call
事件。这些事件在下面给出的代码中突出显示。
# program to display the functioning of
# settrace()
from sys import settrace
# local trace function which returns itself
def my_tracer(frame, event, arg = None):
# extracts frame code
code = frame.f_code
# extracts calling function name
func_name = code.co_name
# extracts the line number
line_no = frame.f_lineno
print(f"A {event} encountered in \
{func_name}() at line number {line_no} ")
return my_tracer
# global trace function is invoked here and
# local trace function is set for fun()
def fun():
return "GFG"
# global trace function is invoked here and
# local trace function is set for check()
def check():
return fun()
# returns reference to local
# trace function (my_tracer)
settrace(my_tracer)
check()
输出:
A call encountered in check() at line number 30 A line encountered in check() at line number 31 A call encountered in fun() at line number 24 A line encountered in fun() at line number 25 A return encountered in fun() at line number 25 A return encountered in check() at line number 31
您可能想知道为什么 local 函数my_code
返回自己?
原因隐藏在运行中sys.settrace()
.什么sys.settrace
所做的是它首先注册一个全局跟踪,每当创建一个返回我们的本地跟踪函数的帧时调用该跟踪my_trace
每当发生上述任何一项事件时。为了更好地理解,请看下图:
如果我们不希望我们的范围被追踪,那么None
应该返回,但如果不是这种情况,我们可能想对本地跟踪函数做同样的事情,那么它应该返回None
否则,如果有错误,那么settrace(None)
被自动调用。
注意:有一个函数名为gettrace
可在sys
获取跟踪设置的模块sys.settrace()
注:本文由纯净天空筛选整理自nishkarsh146大神的英文原创作品 Python – sys.settrace()。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。