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使用pygame模块编写俄罗斯方块游戏的代码实例
Dec 08 Python
Python设计模式之代理模式简单示例
Jan 09 Python
浅谈Python反射 &amp; 单例模式
Mar 21 Python
Python3.6中Twisted模块安装的问题与解决
Apr 15 Python
详解10个可以快速用Python进行数据分析的小技巧
Jun 24 Python
django 消息框架 message使用详解
Jul 22 Python
python实现微信小程序用户登录、模板推送
Aug 28 Python
对Tensorflow中Device实例的生成和管理详解
Feb 04 Python
Pycharm中安装Pygal并使用Pygal模拟掷骰子(推荐)
Apr 08 Python
python实现简单猜单词游戏
Dec 24 Python
python 安全地删除列表元素的方法
Mar 16 Python
Python日志模块logging用法
Jun 05 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
php5 图片验证码实现代码
2009/12/11 PHP
PHP利用超级全局变量$_GET来接收表单数据的实例
2016/11/05 PHP
php删除数组指定元素实现代码
2017/05/03 PHP
php 输出缓冲 Output Control用法实例详解
2020/03/03 PHP
认识延迟时间为0的setTimeout
2008/05/16 Javascript
javascript 短路法代码精简
2009/08/20 Javascript
Prototype的Class.create函数解析
2011/09/22 Javascript
Uglifyjs(JS代码优化工具)入门 安装使用
2020/04/13 Javascript
js自定义事件及事件交互原理概述(二)
2013/02/01 Javascript
Extjs4实现两个GridPanel之间数据拖拽功能具体方法
2013/11/21 Javascript
jQuery使用fadeout实现元素渐隐效果的方法
2015/03/27 Javascript
HTML5使用DeviceOrientation实现摇一摇功能
2015/06/05 Javascript
jquery.map()方法的使用详解
2015/07/09 Javascript
js只执行1次的函数示例
2016/07/20 Javascript
JS实现访问DOM对象指定节点的方法示例
2018/04/04 Javascript
基于element-ui组件手动实现单选和上传功能
2018/12/06 Javascript
Vue组件实现触底判断
2019/06/26 Javascript
使用Python写CUDA程序的方法
2017/03/27 Python
让Python更加充分的使用Sqlite3
2017/12/11 Python
python微信跳一跳系列之色块轮廓定位棋盘
2018/02/26 Python
python+ffmpeg视频并发直播压力测试
2018/03/06 Python
Python使用 Beanstalkd 做异步任务处理的方法
2018/04/24 Python
Python闭包执行时值的传递方式实例分析
2018/06/04 Python
Django框架模板介绍
2019/01/15 Python
Django实现单用户登录的方法示例
2019/03/28 Python
Python3 翻转二叉树的实现
2019/09/30 Python
python scrapy重复执行实现代码详解
2019/12/28 Python
Pytorch实现各种2d卷积示例
2019/12/30 Python
Python虚拟环境virtualenv创建及使用过程图解
2020/12/08 Python
详解Python中的GIL(全局解释器锁)详解及解决GIL的几种方案
2021/01/29 Python
新奇的小玩意:IWOOT
2016/07/21 全球购物
客服文员岗位职责
2013/11/29 职场文书
法人代表授权委托书
2014/04/08 职场文书
2015欢度元旦标语口号
2014/12/09 职场文书
表扬信范文
2015/05/04 职场文书
win10音频服务未响应怎么解决?win10音频服务未响应未修复的解决方法
2022/08/14 数码科技