Python 3.6如何将traceback.extract_stack输出转为2.7元组格式?
在Python 3.6中兼容Python 2.7的traceback.extract_stack输出格式
要在Python 3.6中得到和Python 2.7一致的栈追踪格式,核心是把traceback.extract_stack()返回的FrameSummary对象转换为对应的元组。
关键属性对应关系
Python 3.6的FrameSummary对象包含四个属性,正好匹配Python 2.7返回元组的四个元素:
filename→ 元组第1位(文件名)lineno→ 元组第2位(行号)name→ 元组第3位(函数/模块名称)line→ 元组第4位(该行的代码文本)
格式转换实现
用列表推导式遍历栈追踪结果,将每个FrameSummary对象转换成元组即可。如果遇到无法获取代码行的情况(line为None),用空字符串替代,保证格式统一。
修改后的测试代码
import traceback def fun2(): tx = traceback.extract_stack() # 转换为Python2.7兼容的元组列表格式 compatible_stack = [(frame.filename, frame.lineno, frame.name, frame.line or '') for frame in tx] print(compatible_stack) def fun1(): si = 'Hello' fun2() fun1() fun2()
运行结果
执行后输出会和Python 2.7版本完全一致:
[('a1.py', 11, '<module>', 'fun1()'), ('a1.py', 10, 'fun1', 'fun2()'), ('a1.py', 5, 'fun2', 'tx = traceback.extract_stack();')] [('a1.py', 12, '<module>', 'fun2()'), ('a1.py', 5, 'fun2', 'tx = traceback.extract_stack();')]
内容的提问来源于stack exchange,提问作者sardesh
相关产品推荐
相关产品推荐

