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使用cookie库操保存cookie详解
Mar 03 Python
Python读取图片EXIF信息类库介绍和使用实例
Jul 10 Python
Python文件操作类操作实例详解
Jul 11 Python
python BeautifulSoup设置页面编码的方法
Apr 03 Python
python实现redis三种cas事务操作
Dec 19 Python
Python实现PyPDF2处理PDF文件的方法示例
Sep 25 Python
pycharm 更改创建文件默认路径的操作
Feb 15 Python
python如何从键盘获取输入实例
Jun 18 Python
Python 字符串池化的前提
Jul 03 Python
python爬虫scrapy基于CrawlSpider类的全站数据爬取示例解析
Feb 20 Python
python 机器学习的标准化、归一化、正则化、离散化和白化
Apr 16 Python
python脚本框架webpy模板赋值实现
Nov 20 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/11/10 PHP
php mysql PDO 查询操作的实例详解
2017/09/23 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
2020/02/16 PHP
jquery ajax提交整个表单元素的快捷办法
2013/03/27 Javascript
Vuejs第一篇之入门教程详解(单向绑定、双向绑定、列表渲染、响应函数)
2016/09/09 Javascript
基于NodeJS+MongoDB+AngularJS+Bootstrap开发书店案例分析
2017/01/12 NodeJs
实例解析js中try、catch、finally的执行规则
2017/02/24 Javascript
angularjs的select使用及默认选中设置
2017/04/08 Javascript
Vue.js分页组件实现:diVuePagination的使用详解
2018/01/10 Javascript
vue cli升级webapck4总结
2018/04/04 Javascript
JavaScript创建对象方法实例小结
2018/09/03 Javascript
bootstrap table.js动态填充单元格数据的多种方法
2019/07/18 Javascript
移动端JS实现拖拽两种方法解析
2020/10/12 Javascript
[01:00]DOTA2 store: Collection of Artisan's Wonders
2015/08/12 DOTA
如何搜索查找并解决Django相关的问题
2014/06/30 Python
Python基础入门之seed()方法的使用
2015/05/15 Python
python中的变量如何开辟内存
2018/06/26 Python
对python中类的继承与方法重写介绍
2019/01/20 Python
Python实现监控Nginx配置文件的不同并发送邮件报警功能示例
2019/02/26 Python
python实现逆滤波与维纳滤波示例
2020/02/26 Python
基于python实现把json数据转换成Excel表格
2020/05/07 Python
Python常用数字处理基本操作汇总
2020/09/10 Python
布局和排版教程 纯css3实现图片三角形排列
2014/10/17 HTML / CSS
html5图片上传预览示例分享
2014/04/14 HTML / CSS
德国原装品牌香水、化妆品和手表网站:BRASTY.DE
2016/10/16 全球购物
Myprotein芬兰官网:欧洲第一运动营养品牌
2019/05/05 全球购物
会计学财务管理专业个人的自我评价
2013/10/19 职场文书
网上蛋糕店创业计划书
2014/01/24 职场文书
入党积极分子批评与自我批评思想汇报
2014/09/14 职场文书
自荐信格式范文
2015/03/04 职场文书
入党自荐书范文
2015/03/05 职场文书
2015年评职称工作总结范文
2015/04/20 职场文书
运动会新闻稿
2015/07/17 职场文书
志愿者工作心得体会
2016/01/15 职场文书
python process模块的使用简介
2021/05/14 Python
HTML页面中使两个div并排显示的实现
2022/05/15 HTML / CSS