python - 识别当前正在执行哪个函数调用

标签 python python-3.x debugging stack-trace

在同一行多次调用同一函数时。出于故障排除的目的,是否可以使用回溯或 sys 库来识别当前正在执行哪一个?

编辑:请不要提供解决方法。我知道关于如何解决这个问题所需的一切。我想知道的是,是否有一种方法可以找到有关解析/执行状态的更精确的信息,而不仅仅是调用指令的行号。

让我们举个例子:

#!/usr/bin/python3
# coding: UTF-8


def fn(var):
    import traceback
    print(repr(traceback.extract_stack()[-2]))
    return var+1

a = b = 4
print(fn(a)+fn(b))

在空闲状态下运行它会写入:

 RESTART: /.../python/framesummary.py 
<FrameSummary file /.../python/framesummary.py, line 11 in <module>>
<FrameSummary file /.../python/framesummary.py, line 11 in <module>>
10

有没有办法知道fn函数内部当前正在执行fn(a)还是fn(b)

<小时/>

编辑2:

我添加了一个案例,显示调用顺序无法使用

#!/usr/bin/python3
# coding: UTF-8

def fn(var):
    import traceback
    stack = traceback.extract_stack()
    print(repr(stack[-2]))
    print("code = '"+stack[-2][-1]+"'")

    import sys
    calling_frame = sys._getframe(1)
    print("lasti =", calling_frame.f_lasti)
    print()

    return var+1

a = b = 4
print("case = sum", fn(a)+fn(b), "\n")
for boole in False, True:
    print("case =", boole, fn(a) if boole else fn(b), "\n")

将打印:

 RESTART: /.../python/framesummary cleaned.py 
<FrameSummary file /.../python/framesummary cleaned.py, line 18 in <module>>
code = 'print("case = sum", fn(a)+fn(b), "\n")'
lasti = 34

<FrameSummary file /.../python/framesummary cleaned.py, line 18 in <module>>
code = 'print("case = sum", fn(a)+fn(b), "\n")'
lasti = 43

case = sum 10 

<FrameSummary file /.../python/framesummary cleaned.py, line 20 in <module>>
code = 'print("case =", boole, fn(a) if boole else fn(b), "\n")'
lasti = 100

case = False 5 

<FrameSummary file /.../python/framesummary cleaned.py, line 20 in <module>>
code = 'print("case =", boole, fn(a) if boole else fn(b), "\n")'
lasti = 88

case = True 5 

如果能够指示调用的第一个字符,或者重新编译代码以获得与每个调用相对应的 Lasti 值,那就太好了。

显然,分析结果表明lasti的值与位置相关,但到目前为止,我还没有找到在执行程序之前知道这种关系的方法:

lasti =  34 => (line, column) = (18, 33) (or pos=29 in unindented string⁽¹⁾)
lasti =  43 => (line, column) = (18, 39) (or pos=35 in unindented string⁽¹⁾)
lasti =  88 => (line, column) = (20, 40) (or pos=32 in unindented string⁽¹⁾)
lasti = 100 => (line, column) = (20, 60) (or pos=52 in unindented string⁽¹⁾)

(1) 由 stack[-2][-1] 给出

最佳答案

您可以发送一个唯一且随机的 ID 作为额外参数,并将其添加到日志中。

标识符将帮助您追溯到起源。

a = b = 4
id1 = some random no.
id2 = some random no.
print(fn(a, id1)+fn(b, id2))

关于python - 识别当前正在执行哪个函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55233043/

相关文章:

python - 避免 python 范围错误的策略

php - Docker 和 XDebug 不读取断点 VSCode

python - 如何在 tkinter 中创建 4 个方 block ,使它们从屏幕中间开始,每个方 block 进入自己的角落并消失?

python - Tkinter 退出命令无限循环

python - pipenv 安装包失败

python - __init__ 方法中的异常处理

python - Perl 中有类似 Python Itertools 的东西吗?

Python cassandra 驱动程序 : Invalid or unsupported protocol version: 4

python - 无法在 VScode 中调试 Python

debugging - 检测 OpenMP 线程/CUDA 流之间的竞争条件