Python – sys.settrace()
Python sys
模块提供了一些强大的功能,但它们理解起来很复杂。其中之一是用于实现调试器、分析器和覆盖工具的sys.settrace()
。这是特定于线程的,必须使用threading.settrace()
注册跟踪。
如果您计划创建自己的调试器,了解函数内部的工作原理非常重要。
在更高级别上, sys.settrace()
将回溯注册到Python解释器。回溯基本上是代码中发生事件时返回的信息。当您的代码出现错误或引发异常时,您可能已经看到了traceback
。
当以下四个事件之一发生时,将调用已注册的回溯:
- 函数被调用
- 函数返回
- 执行一条线
- 引发异常
Syntax: sys.settrace(frame, event, arg.frame)
Parameters:
frame: frame is the current stack frame
event: A string which be either 'call', 'line', 'return', 'exception'
or 'opcode'
arg: Depends on the event type
Returns: Reference to the local trace function which then returns reference to itself.
例子:
让我们用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
您可能想知道为什么本地函数my_code
返回自身?
原因隐藏在sys.settrace()
的功能中。 sys.settrace
所做的是它首先注册一个全局跟踪,每当创建一个框架时调用该跟踪,每当发生上述任何事件时,它都会返回我们的本地跟踪函数my_trace
。为了更好地理解,请看下图:
如果我们不希望我们的范围被跟踪,那么None
应该返回,但如果不是这种情况,我们可能想对我们的本地跟踪函数做同样的事情,那么它应该返回None
如果有错误然后settrace(None)
被自动调用。
注意:在sys
模块中有一个名为gettrace
的函数,用于获取sys.settrace()
设置的跟踪