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制作检测Linux运行信息的工具的教程
Apr 01 Python
python编程通过蒙特卡洛法计算定积分详解
Dec 13 Python
django解决跨域请求的问题详解
Jan 20 Python
强悍的Python读取大文件的解决方案
Feb 16 Python
python输出电脑上所有的串口名的方法
Jul 02 Python
Apache部署Django项目图文详解
Jul 30 Python
Python模块 _winreg操作注册表
Feb 05 Python
python生成13位或16位时间戳以及反向解析时间戳的实例
Mar 03 Python
python中常见错误及解决方法
Jun 21 Python
python使用nibabel和sitk读取保存nii.gz文件实例
Jul 01 Python
Django配置Bootstrap, js实现过程详解
Oct 13 Python
python反编译教程之2048小游戏实例
Mar 03 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不用内置函数对数组排序的两个算法代码
2010/02/08 PHP
PHP中对用户身份认证实现两种方法
2011/06/04 PHP
Zend Framework框架中实现Ajax的方法示例
2017/06/27 PHP
PHP实现登陆并抓取微信列表中最新一组微信消息的方法
2017/07/10 PHP
php实现将二维关联数组转换成字符串的方法详解
2017/07/31 PHP
Thinkphp5.0 框架使用模型Model添加、更新、删除数据操作详解
2019/10/11 PHP
jQuery结合PHP+MySQL实现二级联动下拉列表[实例]
2011/11/15 Javascript
jquery获取iframe中的dom对象(两种方法)
2013/07/02 Javascript
Javascript正则控制文本框只能输入整数或浮点数
2014/09/02 Javascript
JavaScript设计模式之单件模式介绍
2014/12/28 Javascript
jquery.cookie.js使用指南
2015/01/05 Javascript
vue快捷键与基础指令详解
2017/06/01 Javascript
深入理解requireJS-实现一个简单的模块加载器
2018/01/15 Javascript
jQuery无冲突模式详解
2019/01/17 jQuery
Vue.js项目实战之多语种网站的功能实现(租车)
2019/08/07 Javascript
javascript/jquery实现点击触发事件的方法分析
2019/11/11 jQuery
js实现限定范围拖拽的示例
2020/10/26 Javascript
[01:15:15]VG VS EG Supermajor小组赛B组胜者组第一轮 BO3第二场 6.2
2018/06/03 DOTA
总结网络IO模型与select模型的Python实例讲解
2016/06/27 Python
python的pdb调试命令的命令整理及实例
2017/07/12 Python
Python 利用内置set函数对字符串和列表进行去重的方法
2018/06/29 Python
PyCharm中如何直接使用Anaconda已安装的库
2020/05/28 Python
使用css实现android系统的loading加载动画
2019/07/25 HTML / CSS
html5菜单折纸效果
2014/04/22 HTML / CSS
Charlotte Tilbury澳大利亚官网:英国美妆品牌
2018/10/05 全球购物
New Balance加拿大官方网站:运动鞋和健身服装
2018/11/19 全球购物
触电现场处置方案
2014/05/14 职场文书
最美护士演讲稿
2014/08/27 职场文书
2015年质量月活动总结报告
2015/03/27 职场文书
2015年信访工作总结
2015/04/07 职场文书
婚育证明格式
2015/06/17 职场文书
导游词之天津盘山
2019/11/01 职场文书
python实现简单的聊天小程序
2021/07/07 Python
MYSQL 的10大经典优化案例场景实战
2021/09/14 MySQL
为Centos安装指定版本的Docker
2022/04/01 Servers
详解MongoDB排序时内存大小限制与创建索引的注意事项
2022/05/06 MongoDB