为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕仙森 2021-12-09 10:57:21
在同一行上多次调用同一函数时。是否可以出于故障排除目的,使用回溯或 sys 库来确定当前正在执行哪个?编辑:请不要提供解决方法。我知道我需要知道的关于如何解决这个问题的所有信息。我想知道的是,是否有一种方法可以找到有关解析/执行状态的更精确信息,而不仅仅是调用指令的行号。让我们以这个例子为例:#!/usr/bin/python3# coding: UTF-8def fn(var):    import traceback    print(repr(traceback.extract_stack()[-2]))    return var+1a = b = 4print(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-8def 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+1a = b = 4print("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 = 43case = 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 = 100case = 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 = 88case = True 5 最好是指示调用的第一个字符,或者重新编译代码以获得与每个调用对应的 lasti 值的方法。
查看完整描述

2 回答

?
烙印99

TA贡献1829条经验 获得超13个赞

我认为你最好的选择是学习如何使用pdb。虽然您可以更改代码以对正在运行的代码进行某种有限的内省。获得一个正在运行的调试器以允许您在评估代码时观察代码的状态会更容易并且最终更有价值。


试试pdb


def fn(var):

    import pdb; pdb.set_trace()

    return var+1


a = b = 4

print(fn(a)+fn(b)

这将打开 python 调试器并允许您执行诸如使用w代表在 pdb 中打印堆栈跟踪的位置之类的操作。或者l显示当前执行行的源代码,等等。


它看起来像这样


owen@lettuce:~ python temp.py

> /home/owen/temp.py(3)fn()

-> return var+1

(Pdb) w

  /home/owen/temp.py(6)<module>()

-> print(fn(a)+fn(b))

> /home/owen/temp.py(3)fn()

-> return var+1

(Pdb) l

  1     def fn(var):

  2         import pdb; pdb.set_trace()

  3  ->     return var+1

  4

  5     a = b = 4

  6     print(fn(a)+fn(b))

[EOF]

(Pdb)


祝你好运。希望这可以帮助。


查看完整回答
反对 回复 2021-12-09
?
白板的微信

TA贡献1883条经验 获得超3个赞

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


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


a = b = 4

id1 = some random no.

id2 = some random no.

print(fn(a, id1)+fn(b, id2))


查看完整回答
反对 回复 2021-12-09
  • 2 回答
  • 0 关注
  • 225 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信