当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python sys.settrace()用法及代码示例


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

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

在更高的层次上,sys.settrace()将回溯注册到 Python 解释器。回溯本质上是代码中发生事件时返回的信息。你可能见过traceback当您的代码出现错误或引发异常时。

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

  1. 函数被调用
  2. 函数返回
  3. 执行一条线
  4. 引发异常
用法: 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每当发生上述任何一项事件时。为了更好地理解,请看下图:

Working-of-settrace-python

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

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



注:本文由纯净天空筛选整理自nishkarsh146大神的英文原创作品 Python – sys.settrace()。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。