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里大整数相乘相关技巧指南
Sep 12 Python
安装Python的教程-Windows
Jul 22 Python
Python KMeans聚类问题分析
Feb 23 Python
django-allauth入门学习和使用详解
Jul 03 Python
利用Python的turtle库绘制玫瑰教程
Nov 23 Python
python连接PostgreSQL过程解析
Feb 09 Python
解决jupyter运行pyqt代码内核重启的问题
Apr 16 Python
python使用多线程+socket实现端口扫描
May 28 Python
浅谈Python3中print函数的换行
Aug 05 Python
Python Selenium实现无可视化界面过程解析
Aug 25 Python
python从Oracle读取数据生成图表
Oct 14 Python
pip 20.3 新版本发布!即将抛弃 Python 2.x(推荐)
Dec 16 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 字符串 小常识
2009/06/05 PHP
WordPress中给媒体文件添加分类和标签的PHP功能实现
2015/12/31 PHP
layui框架实现文件上传及TP3.2.3(thinkPHP)对上传文件进行后台处理操作示例
2018/05/12 PHP
json跟xml的对比分析
2008/06/10 Javascript
js获取url参数代码实例分享(JS操作URL)
2013/12/13 Javascript
JavaScript基本数据类型及值类型和引用类型
2015/08/25 Javascript
JS+CSS实现的经典tab选项卡效果代码
2015/09/16 Javascript
BootStrap创建响应式导航条实例代码
2016/05/31 Javascript
Bootstrap组合上、下拉框简单实现代码
2017/03/06 Javascript
JS中的数组转变成JSON格式字符串的方法
2017/05/09 Javascript
微信小程序实现列表页的点赞和取消点赞功能
2018/11/02 Javascript
详解Vue源码之数据的代理访问
2018/12/11 Javascript
vue-cli项目使用mock数据的方法(借助express)
2019/04/15 Javascript
微信小程序实现多行文字超出部分省略号显示功能
2019/10/23 Javascript
nodejs实现的http、https 请求封装操作示例
2020/02/06 NodeJs
简单了解JS打开url的方法
2020/02/21 Javascript
vue el-tree 默认展开第一个节点的实现代码
2020/05/15 Javascript
nodejs+koa2 实现模仿springMVC框架
2020/10/21 NodeJs
Python机器学习之SVM支持向量机
2017/12/27 Python
Python线性方程组求解运算示例
2018/01/17 Python
pandas.dataframe中根据条件获取元素所在的位置方法(索引)
2018/06/07 Python
关于不懂Chromedriver如何配置环境变量问题解决方法
2019/06/12 Python
python使用writerows写csv文件产生多余空行的处理方法
2019/08/01 Python
从pandas一个单元格的字符串中提取字符串方式
2019/12/17 Python
python中format函数如何使用
2020/06/22 Python
canvas画布实现手写签名效果的示例代码
2019/04/23 HTML / CSS
HTML5输入框下拉菜单功能的示例代码
2020/09/08 HTML / CSS
同程旅游英文网站:LY.com
2018/11/13 全球购物
关于元旦的广播稿
2014/02/16 职场文书
秋天的怀念教学反思
2014/04/28 职场文书
员工保密承诺书
2014/05/28 职场文书
标准大学生职业生涯规划书写作指南
2014/09/18 职场文书
村主任群众路线个人对照检查材料
2014/09/26 职场文书
2015年端午节活动策划书
2015/05/05 职场文书
中国梦党课学习心得体会
2016/01/05 职场文书
Mysql数据库索引面试题(程序员基础技能)
2021/05/31 MySQL