16.5.5 底层栈API
还有一组类似的函数可以用来对当前调用栈而不是traceback完成同样的操作。print_stack()会打印当前栈,而不生成异常。
import traceback
import sys
from traceback_example import call_function
def f():
traceback.print_stack(file=sys.stdout)
print('Calling f() directly:')
f()
print()
print('Calling f() from 3 level deep:')
call_function(f)
输出看起来就像一个traceback,只是没有错误消息。
就行format_exception()准备traceback一样,format_stack()以同样的方式准备栈轨迹。
import traceback
import sys
from pprint import pprint
from traceback_example import call_function
def f():
return traceback.format_stack()
formatted_stack = call_function(f)
pprint(formatted_stack)
它会返回一个字符串列表,每个字符串构成输出的一行。
extract_stack()函数的做法与extract_tb()类似。
import traceback
import sys
import os
from traceback_example import call_function
template = '{filename:<26}:{linenum}:{funcname}:\n {source}'
def f():
return traceback.extract_stack()
stack = call_function(f)
for filename,linenum,funcname,source in stack:
if funcname != '<module>':
funcname = funcname + '()'
print(template.format(
filename=os.path.basename(filename),
linenum=linenum,
source=source,
funcname=funcname)
)
它也接受参数(不过这里没有显示),从而可以从栈帧中一个候选位置开始,或者用来限制遍历的深度。