除錯複雜呼叫鏈時,需要知道完整呼叫堆疊。利用 sys._getframe() 向上遍歷框架物件,可取得檔案名、函數名、行號,組合成可讀字串。
import sys, os
def detailtrace(info):
ret = []
f = sys._getframe().f_back # 跳過 detailtrace 自身
while f:
co = f.f_code
ret.append(f"{os.path.basename(co.co_filename)}({co.co_name}:{f.f_lineno})")
f = f.f_back
print("->".join(reversed(ret)) + "->" + info)
def foo():
detailtrace("hello world")
def bar():
foo()
def main():
bar()
if __name__ == "__main__":
main()
aaa1.py(main:27)->aaa1.py(bar:24)->aaa1.py(foo:21)->hello world
import logging
def log_stack(logger, level, msg):
frames = []
f = sys._getframe().f_back
while f:
co = f.f_code
frames.append(f"{co.co_filename}:{co.co_name}:{f.f_lineno}")
f = f.f_back
logger.log(level, "%s\nStack:\n%s", msg, "\n".join(reversed(frames)))
sys._getframe() 為 CPython 實作細節,其他實現 (PyPy, MicroPython) 可能不支援。traceback 模組標準化格式。此工具快速定位「誰呼叫了誰」,是除錯利器。