您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

5b51 2022/1/14 8:23:27 python 字数 3300 阅读 604 来源 www.jb51.cc/python

在内部跟踪功能,调试函数调用时,是否可以以某种方式检索调用表达式? 我可以从traceback对象中调用行号,但如果该行上有多个函数调用(可能是相同的函数)(例如,作为更大表达式中的子表达式),那么我怎样才能知道这个调用的来源?即使从源线的起点偏移,我也会很高兴. traceback.tb_lasti似乎给出了更多的粒度上下文(尝试了最后一个字节码的索引) – 是否有可能将字节码连接到其确切的源范

概述

我可以从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执行此操作,但是您不能逐行执行此操作,因为您需要范围上下文来生成本地与单元格与全局名称查找的正确字节码.

总结

以上是编程之家为你收集整理的如何在跟踪Python函数时获取调用表达式?全部内容,希望文章能够帮你解决如何在跟踪Python函数时获取调用表达式?所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶