我可以从traceback对象中调用行号,但如果该行上有多个函数调用(可能是相同的函数)(例如,作为更大表达式中的子表达式),那么我怎样才能知道这个调用的来源?即使从源线的起点偏移,我也会很高兴.
traceback.tb_lasti似乎给出了更多的粒度上下文(尝试了最后一个字节码的索引) – 是否有可能将字节码连接到其确切的源范围?
编辑:只是为了澄清 – 我需要从调用源代码行中提取特定的(子)表达式(调用点).
解决方法 回溯帧也有一个行号:lineno = traceback.tb_lineno
您还可以访问代码对象,该对象具有名称和文件名:
name = traceback.tb_frame.f_code.co_namefilename = 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函数时获取调用表达式?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)