如何在跟踪Python函数时获取调用表达式?

前端之家收集整理的这篇文章主要介绍了如何在跟踪Python函数时获取调用表达式?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在内部跟踪功能,调试函数调用时,是否可以以某种方式检索调用表达式?

我可以从traceback对象中调用行号,但如果该行上有多个函数调用(可能是相同的函数)(例如,作为更大表达式中的子表达式),那么我怎样才能知道这个调用的来源?即使从源线的起点偏移,我也会很高兴.

traceback.tb_lasti似乎给出了更多的粒度上下文(尝试了最后一个字节码的索引) – 是否有可能将字节码连接到其确切的源范围?

编辑:只是为了澄清 – 我需要从调用代码行中提取特定的(子)表达式(调用点).

解决方法

回溯帧也有一个行号:
lineno = traceback.tb_lineno

您还可以访问代码对象,该对象具有名称文件名:

name = traceback.tb_frame.f_code.co_name
filename = traceback.tb_frame.f_code.co_filename

您可以使用文件名和行号,以及帧全局和linecache module来有效地将其转换为正确的源代码行:

linecache.checkcache(filename)
line = linecache.getline(filename,lineno,traceback.tb_frame.f_globals)

在任何情况下,这都是traceback module用于将回溯转换为有用信息的内容.

由于字节码只有一个与之关联的行号,因此不能直接将字节码引回到源代码行的精确部分;您必须自己解析该行以确定每个部分将发出的字节码然后将其与代码对象的字节码进行匹配.

您可以使用ast module执行此操作,但是您不能逐行执行此操作,因为您需要范围上下文来生成本地与单元格与全局名称查找的正确字节码.

原文链接:https://www.f2er.com/python/241993.html

猜你在找的Python相关文章