python调试神器PySnooper的使用


Posted in Python onJuly 03, 2019

相信很多小伙伴平时写python的时候都是需要调试程序的,出问题了,需要了解函数内部是怎么跑的,而这个时候很多人都会想到在疑惑的地方使用print函数来打印一下参数来调试。虽然用print也是不失为是一种方法,但是有时如果疑惑的地方多就要每个地方都要加print,这样就显得比较麻烦了。

今天发现在Github开源了一个神器,可以清楚让你清楚了解函数内部的运行以及参数值的变化,PySnooper,项目地址:https://github.com/cool-RR/PySnooper

使用简单,强大,谁用谁知道它的好!下面简单说一下PySnooper的用法:

这个工具使用起来很简单,首先直接可以使用 pip 安装:pip install pysnooper使用时,只需要在每个函数前面添加装饰器即可。
给个简单例子看看就知道了,

import pysnooper
@pysnooper.snoop()
def removeDuplicates(nums):
  """
  :type nums: List[int]
  :rtype: int
  """
  flag = 0
  i=1
  while i<len(nums):
    if nums[i]==nums[i-1]:
      flag+=1
      i+=1
      if flag>=2:
        del nums[i-1]
        i-=1
    else:
      i+=1
      flag=0
  return len(nums)

nums = [1,1,1,2]
print(removeDuplicates(nums))

添加装饰器后,运行代码就会输出对应函数的执行数据

Starting var:.. nums = [1, 1, 1, 2]
13:03:44.990194 call        11 def removeDuplicates(nums):
13:03:44.990695 line        16     flag = 0
New var:....... flag = 0
13:03:44.990695 line        17     i=1
New var:....... i = 1
13:03:44.990695 line        18     while i<len(nums):
13:03:44.990695 line        19         if nums[i]==nums[i-1]:
13:03:44.990695 line        20             flag+=1
Modified var:.. flag = 1
13:03:44.990695 line        21             i+=1
Modified var:.. i = 2
13:03:44.991193 line        22             if flag>=2:
13:03:44.991193 line        18     while i<len(nums):
13:03:44.991193 line        19         if nums[i]==nums[i-1]:
13:03:44.991193 line        20             flag+=1
Modified var:.. flag = 2
13:03:44.991193 line        21             i+=1
Modified var:.. i = 3
13:03:44.991193 line        22             if flag>=2:
13:03:44.991193 line        23                 del nums[i-1]
Modified var:.. nums = [1, 1, 2]
13:03:44.991193 line        24                 i-=1
Modified var:.. i = 2
13:03:44.991193 line        18     while i<len(nums):
13:03:44.991193 line        19         if nums[i]==nums[i-1]:
13:03:44.991193 line        26             i+=1
Modified var:.. i = 3
13:03:44.991693 line        27             flag=0
Modified var:.. flag = 0
13:03:44.991693 line        18     while i<len(nums):
13:03:44.991693 line        28     return len(nums)
13:03:44.991693 return      28     return len(nums)
Return value:.. 3

当然如果嫌弃这个直接输出内容还想保存日志记录的话,这个装饰器还几个可选参数,例如:

@pysnooper.snoop('log/file.log')

先创建好log目录,然后将日志输出到file文件中。

@pysnooper.snoop(prefix='removeDuplicates: ')

给调试的行加个前缀名便于辨识和定位,这个参数适用于如果同时调试多个函数使用,我这里的例子是使用了函数名称来作为前缀名,摘抄一点日志记录如下:

removeDuplicates: Starting var:.. nums = [1, 1, 1, 2]
removeDuplicates: 13:53:14.322036 call    11 def removeDuplicates(nums):
removeDuplicates: 13:53:14.323037 line    16   flag = 0
@pysnooper.snoop(variables=('foo.bar', 'self.whatever'))

查看非本地变量

@pysnooper.snoop(depth=2)

显示函数中调用函数的snoop行,depth参数的取值范围是大于或等于1的正整数,在源码里有这样一个判断:assert self.depth >= 1,当取小于1的值就会抛异常

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
详细讲解用Python发送SMTP邮件的教程
Apr 29 Python
在Python中操作字典之update()方法的使用
May 22 Python
利用python求相邻数的方法示例
Aug 18 Python
Python实现PS图像调整颜色梯度效果示例
Jan 25 Python
用Django写天气预报查询网站
Oct 21 Python
Gauss-Seidel迭代算法的Python实现详解
Jun 29 Python
Django实现微信小程序的登录验证功能并维护登录态
Jul 04 Python
django删除表重建的实现方法
Aug 28 Python
Python进程池Pool应用实例分析
Nov 27 Python
Python如何获取文件指定行的内容
May 27 Python
详解python tcp编程
Aug 24 Python
详解Python爬虫爬取博客园问题列表所有的问题
Jan 18 Python
详解DeBug Python神级工具PySnooper
Jul 03 #Python
使用python来调用CAN通讯的DLL实现方法
Jul 03 #Python
opencv python 图像轮廓/检测轮廓/绘制轮廓的方法
Jul 03 #Python
在cmd中查看python的安装路径方法
Jul 03 #Python
python动态进度条的实现代码
Jul 03 #Python
OpenCV 轮廓检测的实现方法
Jul 03 #Python
python实现文本进度条 程序进度条 加载进度条 单行刷新功能
Jul 03 #Python
You might like
PHP实现的博客欢迎提示功能(很特别哦)
2014/06/05 PHP
一个经典的PHP验证码类分享
2014/11/18 PHP
四种php中webservice实现的简单架构方法及实例
2015/02/03 PHP
jquery获取ASP.NET服务器端控件dropdownlist和radiobuttonlist生成客户端HTML标签后的value和text值
2010/06/28 Javascript
由Javascript实现的页面日历
2011/11/04 Javascript
php 中序列化和json使用介绍
2013/07/08 Javascript
JSP中使用JavaScript动态插入删除输入框实现代码
2014/06/13 Javascript
对 jQuery 中 data 方法的误解分析
2014/06/18 Javascript
jQuery实现流动虚线框的方法
2015/01/29 Javascript
js淡入淡出焦点图幻灯片效果代码分享
2015/09/08 Javascript
jqPlot jQuery绘图插件的使用
2016/06/18 Javascript
几种tab切换详解
2017/02/03 Javascript
jQuery模拟下拉框选择对应菜单的内容
2017/03/07 Javascript
bootstrap轮播图示例代码分享
2017/05/17 Javascript
node实现mock-plugin中间件的方法
2019/12/25 Javascript
vue-resource post数据时碰到Django csrf问题的解决
2020/03/13 Javascript
vue-quill-editor 自定义工具栏和自定义图片上传路径操作
2020/08/03 Javascript
Python实现字典(dict)的迭代操作示例
2018/06/05 Python
Python代码块批量添加Tab缩进的方法
2018/06/25 Python
python如何以表格形式打印输出的方法示例
2019/06/21 Python
python使用 __init__初始化操作简单示例
2019/09/26 Python
基于Python实现拆分和合并GIF动态图
2019/10/22 Python
python闭包、深浅拷贝、垃圾回收、with语句知识点汇总
2020/03/11 Python
Python 字符串池化的前提
2020/07/03 Python
用pip给python安装matplotlib库的详细教程
2021/02/24 Python
Sunglasses Shop丹麦:欧洲第一的太阳镜在线销售网站
2017/10/22 全球购物
创业者是否需要商业计划书?
2014/02/07 职场文书
房屋买卖委托公证书
2014/04/08 职场文书
小学运动会口号
2014/06/07 职场文书
大学新生军训自我鉴定
2014/09/18 职场文书
股东出资证明书范例
2014/10/04 职场文书
会计电算化实训报告
2014/11/04 职场文书
2015年中秋节活动总结
2015/03/23 职场文书
新生儿未入户证明
2015/06/23 职场文书
2016公司年会主持词
2015/07/01 职场文书
幼儿园教师心得体会范文
2016/01/21 职场文书