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

时间:2019-03-19 03:06:47

标签: 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)


Edit2:

我添加了一个案例,表明无法使用呼叫顺序

#!/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]

给出

2 个答案:

答案 0 :(得分:0)

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

标识符将帮助您追溯到原点。

myRas_2019_01_01.tif

答案 1 :(得分:0)

我认为您最好的选择是学习如何使用pdb。尽管您可以更改代码,以便对运行的代码进行某种程度的自省。获得运行中的调试器将使您更容易,最终更有价值,从而允许您在评估代码时观察代码的状态。

尝试pdb

$sub_data["state"] = ['selected' => true, 'disabled' => true];

这将打开python调试器,并允许您执行诸如使用$sub_data之类的操作,def fn(var): import pdb; pdb.set_trace() return var+1 a = b = 4 print(fn(a)+fn(b) 代表在pdb中打印堆栈跟踪的位置。或w在当前执行行显示源代码,等等。

看起来像这样

l

祝你好运。希望这会有所帮助。