gpt4 book ai didi

python - 如何在调用函数时打印它们?

转载 作者:IT老高 更新时间:2023-10-28 20:21:34 33 4
gpt4 key购买 nike

在调试 Python 脚本时,我真的很想知道我的整个程序的整个调用堆栈。理想的情况是,如果 python 有一个命令行标志,它会导致 Python 在调用它们时打印所有函数名称(我检查了 man Python2.7,但没有找到任何这种)。

由于此脚本中的函数数量众多,如果可能,我不希望在每个函数和/或类的开头添加打印语句。

中间的解决方案是使用 PyDev 的调试器,放置几个断点并检查调用堆栈中的给定点在我的程序中,所以我将暂时使用这种方法。

如果存在这样的方法,我仍然希望看到在程序的整个生命周期中调用的所有函数的完整列表。

最佳答案

您可以使用跟踪函数来做到这一点(Spacedman 的 Prop ,用于改进原始版本以跟踪返回并使用一些不错的缩进):

def tracefunc(frame, event, arg, indent=[0]):
if event == "call":
indent[0] += 2
print("-" * indent[0] + "> call function", frame.f_code.co_name)
elif event == "return":
print("<" + "-" * indent[0], "exit function", frame.f_code.co_name)
indent[0] -= 2
return tracefunc

import sys
sys.setprofile(tracefunc)

main() # or whatever kicks off your script

请注意,函数的代码对象通常与关联函数具有相同的名称,但并非总是如此,因为函数可以动态创建。不幸的是,Python 不跟踪堆栈上的函数对象(我有时幻想着为此提交一个补丁)。不过,在大多数情况下,这肯定“足够好”了。

如果这成为问题,您可以从源代码中提取“真正的”函数名——Python 确实会跟踪文件名和行号——或者让垃圾收集器找出哪个函数对象引用了代码对象。可能有多个函数共享代码对象,但它们的任何名称都可能足够好。

四年后再次回顾这一点,我有必要提一下,在 Python 2.6 及更高版本中,您可以通过使用 sys.setprofile() 而获得更好的性能比 sys.settrace()。可以使用相同的跟踪功能;只是profile函数只有在进入或退出函数时才会被调用,所以函数里面的东西是全速执行的。

关于python - 如何在调用函数时打印它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8315389/

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