當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


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()。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。