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