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实现二分法算法实例
Feb 02 Python
在Python中通过threading模块定义和调用线程的方法
Jul 12 Python
Python 遍历列表里面序号和值的方法(三种)
Feb 17 Python
Linux CentOS7下安装python3 的方法
Jan 21 Python
python 字典中文key处理,读取,比较方法
Jul 06 Python
Python3.7 读取 mp3 音频文件生成波形图效果
Nov 05 Python
PyCharm汉化安装及永久激活详细教程(靠谱)
Jan 16 Python
对python中 math模块下 atan 和 atan2的区别详解
Jan 17 Python
python中sklearn的pipeline模块实例详解
May 21 Python
OpenCV图片漫画效果的实现示例
Aug 18 Python
python非标准时间的转换
Jul 25 Python
python中的getter与setter你了解吗
Mar 24 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如何抛出异常处理错误
2011/03/02 PHP
mysql总结之explain
2012/02/27 PHP
CI框架给视图添加动态数据
2014/12/01 PHP
thinkphp3.2.2实现生成多张缩略图的方法
2014/12/19 PHP
php微信开发之谷歌测距
2018/06/14 PHP
php引用和拷贝的区别知识点总结
2019/09/23 PHP
JS option location 页面跳转实现代码
2008/12/27 Javascript
StringTemplate遇见jQuery冲突的解决方法
2011/09/22 Javascript
基于Unit PNG Fix.js有时候在ie6下不正常的解决办法
2013/06/26 Javascript
jQuery对于显示和隐藏等常用状态的判断方法
2014/12/13 Javascript
浅谈JSON.parse()和JSON.stringify()
2015/07/14 Javascript
JavaScript的React框架中的JSX语法学习入门教程
2016/03/05 Javascript
jquery无法为动态生成的元素添加点击事件的解决方法(推荐)
2016/12/26 Javascript
JavaScript原生编写《飞机大战坦克》游戏完整实例
2017/01/04 Javascript
Angular2-primeNG文件上传模块FileUpload使用详解
2017/01/14 Javascript
详解vue-router和vue-cli以及组件之间的传值
2017/07/04 Javascript
详解webpack多页面配置记录
2018/01/22 Javascript
简述JS浏览器的三种弹窗
2018/07/15 Javascript
微信小程序实现两边小中间大的轮播效果的示例代码
2018/12/07 Javascript
layer弹出层自适应高度,垂直水平居中的实现
2019/09/16 Javascript
JS快速实现简单计算器
2020/04/08 Javascript
[33:42]LGD vs OG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python中的ConfigParser模块使用详解
2015/05/04 Python
详解Golang 与python中的字符串反转
2017/07/21 Python
浅谈pandas中Dataframe的查询方法([], loc, iloc, at, iat, ix)
2018/04/10 Python
Flask框架使用DBUtils模块连接数据库操作示例
2018/07/20 Python
Jupyter Notebook 实现正常显示中文和负号
2020/04/24 Python
使用layui实现左侧菜单栏及动态操作tab项的方法
2020/11/10 HTML / CSS
【魔兽争霸3重制版】原版画面与淬火MOD画面对比
2021/03/26 魔兽争霸
生产现场工艺工程师岗位职责
2013/11/28 职场文书
贸易跟单员英文求职信
2014/04/19 职场文书
国家机关领导干部民主生活会对照检查材料思想汇报
2014/09/17 职场文书
基层领导干部“四风”问题批评与自我批评
2014/09/23 职场文书
公司人力资源管理制度
2015/08/05 职场文书
放飞理想主题班会
2015/08/14 职场文书
MySQL数据库实验之 触发器和存储过程
2022/06/21 MySQL