
Python 的 pysnooper 库是一个强大的调试工具,它允许开发者以最小的努力跟踪代码的执行过程。与传统的调试工具相比,pysnooper 不需要设置断点,只需一个装饰器或者一个简单的函数调用,就可以输出代码执行的详细过程,极大地简化了调试工作。
pip install pysnooper # 安装 pysnooper

import pysnooper@pysnooper.snoop()def A():try:print("begin")a = []a.append("NO1")a.append("NO2")return aexcept:print("fail")if __name__ == "__main__":data = A()print(data)
# 代码调用时间 行号 代码片段# 新的/修改的值(New Modified var)# 返回值(Return value)# 一共消耗时间(Elapsed time)
09:19:34.417000 call 4 def A():09:19:34.420000 line 5 try:09:19:34.421000 line 6 print("begin")begin09:19:34.422000 line 7 a = []New var:....... a = []09:19:34.422000 line 8 a.append("NO1")Modified var:.. a = ['NO1']09:19:34.423000 line 9 a.append("NO2")Modified var:.. a = ['NO1', 'NO2']09:19:34.424000 line 10 return a09:19:34.426000 return 10 return aReturn value:.. ['NO1', 'NO2']Elapsed time: 00:00:00.011000['NO1', 'NO2']

这里可以看见打印了很多信息,有文件名称、方法名、执行语句、变量变化、返回变量值、执行时间,这样在打印很多东西的时候会很复杂,所以建议要进行方法的划分,不要一个方法写很多逻辑
@pysnooper.snoop(output='/var/log/debug.log') # 重定向到日志文件@pysnooper.snoop(watch=('out["foo"]')) # 跟踪非局部变量值:值有变化时,也将其打印出来@pysnooper.snoop(depth=2) # 设置跟踪函数的深度@pysnooper.snoop(output="/var/log/debug.log", prefix="demo_func: ") # 设置调试日志的前缀@pysnooper.snoop(max_variable_length=200) # 设置最大的输出长度@pysnooper.snoop(max_variable_length=None) # 设置最大的输出长度@pysnooper.snoop(thread_info=True) # 支持多线程调试模式
@pysnooper.snoop(custom_repr=(Person, print_person_obj)) # 自定义对象的格式输出pysnooper.snoop() 函数有一个参数是 custom_repr,它接收一个元组对象。在这个元组里,你可以指定特定类型的对象以特定格式进行输出。假如我要跟踪 person 这个 Person 类型的对象,由于它不是常规的 Python 基础类型,PySnooper 是无法正常输出它的信息的。因此我在 pysnooper.snoop() 函数中设置了 custom_repr 参数,该参数:第一个元素为 Person第二个元素为 print_persion_obj 函数。PySnooper 在打印对象的调试信息时,会逐个判断它是否是 Person 类型的对象,若是,就将该对象传入 print_persion_obj 函数中,由该函数来决定如何显示这个对象的信息。