Python 的 pysnooper 库是一个强大的调试工具,它允许开发者以最小的努力跟踪代码的执行过程。与传统的调试工具相比,pysnooper 不需要设置断点,只需一个装饰器或者一个简单的函数调用,就可以输出代码执行的详细过程,极大地简化了调试工作。
pip install pysnooper # 安装 pysnooper
import pysnooper
@pysnooper.snoop()
def A():
try:
print("begin")
a = []
a.append("NO1")
a.append("NO2")
return a
except:
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")
begin
09: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 a
09:19:34.426000 return 10 return a
Return 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 函数中,由该函数来决定如何显示这个对象的信息。