• 主页

  • 投资

  • IT

    🔥
  • 设计

  • 销售

关闭

返回栏目

关闭

返回python栏目

89 - 第三方库 - pysnooper - Print的高级版|调试|装饰器

作者:

贺及楼

成为作者

更新日期:2024-10-28 10:00:00

pysnooper

pysnooper 的简介

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

安装 pysnooper

  1. pip install pysnooper # 安装 pysnooper

pip安装pysnooper

用法 加一个装饰器@pysnooper.snoop()

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

pysnooper应用
这里可以看见打印了很多信息,有文件名称、方法名、执行语句、变量变化、返回变量值、执行时间,这样在打印很多东西的时候会很复杂,所以建议要进行方法的划分,不要一个方法写很多逻辑

更多设置

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