📜  Python – sys.settrace()

📅  最后修改于: 2022-05-13 01:55:10.251000             🧑  作者: Mango

Python – sys.settrace()

Python sys模块提供了一些强大的功能,但它们理解起来很复杂。其中之一是用于实现调试器、分析器和覆盖工具的sys.settrace() 。这是特定于线程的,必须使用threading.settrace()注册跟踪。

如果您计划创建自己的调试器,了解函数内部的工作原理非常重要。

在更高级别上, sys.settrace()将回溯注册到Python解释器。回溯基本上是代码中发生事件时返回的信息。当您的代码出现错误或引发异常时,您可能已经看到了traceback

当以下四个事件之一发生时,将调用已注册的回溯:

  1. 函数被调用
  2. 函数返回
  3. 执行一条线
  4. 引发异常

例子:

让我们用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 。为了更好地理解,请看下图:

settrace-python 的工作原理

如果我们不希望我们的范围被跟踪,那么None应该返回,但如果不是这种情况,我们可能想对我们的本地跟踪函数做同样的事情,那么它应该返回None如果有错误然后settrace(None)被自动调用。

注意:sys模块中有一个名为gettrace的函数,用于获取sys.settrace()设置的跟踪