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的迭代器与生成器实例详解
Jul 16 Python
python类和函数中使用静态变量的方法
May 09 Python
Python3读取文件常用方法实例分析
May 22 Python
python正则分析nginx的访问日志
Jan 17 Python
用Python写脚本,实现完全备份和增量备份的示例
Apr 29 Python
Python 确定多项式拟合/回归的阶数实例
Dec 29 Python
numpy创建单位矩阵和对角矩阵的实例
Nov 29 Python
Python编写一个验证码图片数据标注GUI程序附源码
Dec 09 Python
pytorch 查看cuda 版本方式
Jun 23 Python
使用Python操作MySQL的小技巧
Sep 10 Python
使用python把xmind转换成excel测试用例的实现代码
Oct 12 Python
python报错TypeError: ‘NoneType‘ object is not subscriptable的解决方法
Nov 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
在smarty模板中使用PHP函数的方法
2011/04/23 PHP
php+mysql查询实现无限下级分类树输出示例
2016/10/03 PHP
JS取得绝对路径的实现代码
2015/01/16 Javascript
在AngularJS中使用AJAX的方法
2015/06/17 Javascript
简单谈谈node.js 版本控制 nvm和 n
2015/10/15 Javascript
非常棒的jQuery图片轮播效果
2016/04/17 Javascript
使用bootstrapValidator插件进行动态添加表单元素并校验
2016/09/28 Javascript
JavaScript prototype属性详解
2016/10/25 Javascript
JavaScript实现的冒泡排序法及统计相邻数交换次数示例
2017/04/26 Javascript
ES6中javascript实现函数绑定及类的事件绑定功能详解
2017/11/08 Javascript
vue + element-ui实现简洁的导入导出功能
2017/12/22 Javascript
Webpack path与publicPath的区别详解
2018/05/03 Javascript
在Vue项目中取消ESLint代码检测的步骤讲解
2019/01/27 Javascript
Vue.js路由实现选项卡简单实例
2019/07/24 Javascript
vue实现滑动切换效果(仅在手机模式下可用)
2020/06/29 Javascript
vue实现路由不变的情况下,刷新页面操作示例
2020/02/02 Javascript
Array.filter中如何正确使用Async
2020/11/04 Javascript
NodeJS配置CORS实现过程详解
2020/12/02 NodeJs
[00:43]FTP典藏礼包 DOTA2三大英雄霸气新套装
2014/03/21 DOTA
python解决方案:WindowsError: [Error 2]
2016/08/28 Python
Python 多线程的实例详解
2017/09/07 Python
Python3多线程操作简单示例
2018/05/22 Python
对python_discover方法遍历所有执行的用例详解
2019/02/13 Python
python 爬取学信网登录页面的例子
2019/08/13 Python
解决Python计算矩阵乘向量,矩阵乘实数的一些小错误
2019/08/26 Python
pytorch: Parameter 的数据结构实例
2019/12/31 Python
Ubuntu16.04安装python3.6.5步骤详解
2020/01/10 Python
tensorflow 大于某个值为1,小于为0的实例
2020/06/30 Python
Python爬虫之Selenium库的使用方法
2021/01/03 Python
学习十八大报告感言
2014/02/04 职场文书
主题党日活动总结
2014/07/08 职场文书
高中美术教师事迹材料
2014/08/22 职场文书
世界水日宣传活动总结
2015/02/09 职场文书
2015年试用期工作总结范文
2015/05/28 职场文书
PostgreSQL解析URL的方法
2021/08/02 PostgreSQL
MySQL分布式恢复进阶
2022/07/23 MySQL