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

在同一行上多次调用同一函数时。是否可以出于故障排除目的,使用回溯或 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 值的方法。



慕仙森
浏览 227回答 2
2回答

烙印99

我认为你最好的选择是学习如何使用pdb。虽然您可以更改代码以对正在运行的代码进行某种有限的内省。获得一个正在运行的调试器以允许您在评估代码时观察代码的状态会更容易并且最终更有价值。试试pdbdef fn(var):&nbsp; &nbsp; import pdb; pdb.set_trace()&nbsp; &nbsp; return var+1a = b = 4print(fn(a)+fn(b)这将打开 python 调试器并允许您执行诸如使用w代表在 pdb 中打印堆栈跟踪的位置之类的操作。或者l显示当前执行行的源代码,等等。它看起来像这样owen@lettuce:~ python temp.py> /home/owen/temp.py(3)fn()-> return var+1(Pdb) w&nbsp; /home/owen/temp.py(6)<module>()-> print(fn(a)+fn(b))> /home/owen/temp.py(3)fn()-> return var+1(Pdb) l&nbsp; 1&nbsp; &nbsp; &nbsp;def fn(var):&nbsp; 2&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;import pdb; pdb.set_trace()&nbsp; 3&nbsp; ->&nbsp; &nbsp; &nbsp;return var+1&nbsp; 4&nbsp; 5&nbsp; &nbsp; &nbsp;a = b = 4&nbsp; 6&nbsp; &nbsp; &nbsp;print(fn(a)+fn(b))[EOF](Pdb)祝你好运。希望这可以帮助。

白板的微信

您可以发送一个唯一且随机的 ID 作为额外参数并将其添加到日志中。标识符将帮助您追溯到起源。a = b = 4id1 = some random no.id2 = some random no.print(fn(a, id1)+fn(b, id2))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python