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 相关文章推荐
Django静态资源URL STATIC_ROOT的配置方法
Nov 08 Python
Python简单日志处理类分享
Feb 14 Python
Python访问纯真IP数据库脚本分享
Jun 29 Python
python更新列表的方法
Jul 28 Python
python探索之BaseHTTPServer-实现Web服务器介绍
Oct 28 Python
利用Pandas读取文件路径或文件名称包含中文的csv文件方法
Jul 04 Python
python如何使用Redis构建分布式锁
Jan 16 Python
pycharm内无法import已安装的模块问题解决
Feb 12 Python
keras分类之二分类实例(Cat and dog)
Jul 09 Python
python爬取天气数据的实例详解
Nov 20 Python
利用Python第三方库实现预测NBA比赛结果
Jun 21 Python
python随机打印成绩排名表
Jun 23 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 实用代码收集
2010/01/22 PHP
PHP中用hash实现的数组
2011/07/17 PHP
xml在joomla表单中的应用详解分享
2012/07/19 PHP
php打造智能化的柱状图程序,用于报表等
2015/06/19 PHP
PHP读取mssql json数据中文乱码的解决办法
2016/04/11 PHP
使用ThinkPHP的自动完成实现无限级分类实例详解
2016/09/02 PHP
PHP实现微信JS-SDK接口选择相册及拍照并上传的方法
2016/12/05 PHP
javascript实现unicode和字符的互相转换
2007/07/18 Javascript
Jquery操作下拉框(DropDownList)实现取值赋值
2013/08/13 Javascript
js点击列表文字对应该行显示背景颜色的实现代码
2015/08/05 Javascript
jquery实现放大镜简洁代码(推荐)
2017/06/08 jQuery
js实现GIF图片的分解和合成
2019/10/24 Javascript
[01:01:29]2018DOTA2亚洲邀请赛 4.4 淘汰赛 VP vs Liquid 第一场
2018/04/05 DOTA
Python自动扫雷实现方法
2015/07/25 Python
Python正则表达式实现截取成对括号的方法
2017/01/06 Python
python编程通过蒙特卡洛法计算定积分详解
2017/12/13 Python
python 3利用Dlib 19.7实现摄像头人脸检测特征点标定
2018/02/26 Python
django 实现将本地图片存入数据库,并能显示在web上的示例
2019/08/07 Python
关于Keras模型可视化教程及关键问题的解决
2020/01/24 Python
python字典按照value排序方法
2020/12/28 Python
CSS3利用text-shadow属性实现多种效果的文字样式展现方法
2016/08/25 HTML / CSS
canvas需要在标签里直接定义宽高
2014/12/17 HTML / CSS
详解移动端HTML5页面端去掉input输入框的白色背景和边框(兼容Android和ios)
2016/12/15 HTML / CSS
Canvas实现放大镜效果完整案例分析(附代码)
2020/11/26 HTML / CSS
Lenox官网:精美的瓷器&独特的礼品
2017/02/12 全球购物
New Balance天猫官方旗舰店:始于1906年,百年慢跑品牌
2017/11/15 全球购物
size?丹麦官网:英国伦敦的球鞋精品店
2019/04/15 全球购物
全球性的众包图形设计市场:DesignCrowd
2021/02/02 全球购物
财务出纳员岗位职责
2013/11/26 职场文书
《乞巧》教学反思
2014/02/27 职场文书
优秀学生干部先进事迹材料
2014/05/26 职场文书
加强干部作风建设整改方案
2014/10/24 职场文书
酒店收银员岗位职责
2015/04/07 职场文书
通知函格式范文
2015/04/27 职场文书
升学宴来宾致辞
2015/07/27 职场文书
Python合并pdf文件的工具
2021/07/01 Python