gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 06:53:41 24 4
gpt4 key购买 nike

在跟踪函数内部调试函数调用时,是否有可能以某种方式检索调用表达式?

我可以从 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函数时如何获取调用表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65723730/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com