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远程桌面协议RDPY安装使用介绍
Apr 15 Python
wxPython中listbox用法实例详解
Jun 01 Python
python使用fork实现守护进程的方法
Nov 16 Python
pyqt5实现登录界面的模板
May 30 Python
Python散点图与折线图绘制过程解析
Nov 30 Python
AUC计算方法与Python实现代码
Feb 28 Python
解决在keras中使用model.save()函数保存模型失败的问题
May 21 Python
使用ITK-SNAP进行抠图操作并保存mask的实例
Jul 01 Python
python FTP编程基础入门
Feb 27 Python
Python实现图片指定位置加图片水印(附Pyinstaller打包exe)
Mar 04 Python
Python 流媒体播放器的实现(基于VLC)
Apr 28 Python
pytorch fine-tune 预训练的模型操作
Jun 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
海贼王动画变成“真人”后,凯多神还原,雷利太帅了!
2020/04/09 日漫
第十四节--命名空间
2006/11/16 PHP
浅析Dos下运行php.exe,出现没有找到php_mbstring.dll 错误的解决方法
2013/06/29 PHP
php实现的CSS更新类实例
2014/09/22 PHP
dedecms集成财付通支付接口
2014/12/28 PHP
PHP简单生成缩略图相册的方法
2015/07/29 PHP
微信支付开发订单查询实例
2016/07/12 PHP
PHP面向对象之事务脚本模式(详解)
2017/06/07 PHP
详细解读php的命名空间(二)
2018/02/21 PHP
HTML颜色选择器实现代码
2010/11/23 Javascript
解读JavaScript代码 var ie = !-[1,] 最短的IE判定代码
2011/05/28 Javascript
JQuery仿小米手机抢购页面倒计时效果
2014/12/16 Javascript
JavaScript 基本概念
2015/01/20 Javascript
简介JavaScript中用于处理正切的Math.tan()方法
2015/06/15 Javascript
js数组的五种迭代方法及两种归并方法(推荐)
2016/06/14 Javascript
VuePress 快速踩坑小结
2019/02/14 Javascript
npm 语义版本控制详解
2019/09/10 Javascript
Vue实现购物车实例代码两则
2020/05/30 Javascript
node.js 基于 STMP 协议和 EWS 协议发送邮件
2021/02/14 Javascript
Python之py2exe打包工具详解
2017/06/14 Python
解决python报错MemoryError的问题
2018/06/26 Python
python中单下划线(_)和双下划线(__)的特殊用法
2019/08/29 Python
解决Python logging模块无法正常输出日志的问题
2020/02/21 Python
python 线性回归分析模型检验标准--拟合优度详解
2020/02/24 Python
Python request使用方法及问题总结
2020/04/26 Python
详解anaconda离线安装pytorchGPU版
2020/09/08 Python
python爬虫基础之urllib的使用
2020/12/31 Python
英国天然有机美容护肤品:Neal’s Yard Remedies
2018/05/05 全球购物
拾金不昧表扬信范文
2014/01/11 职场文书
创先争优一句话承诺
2014/05/29 职场文书
爱与责任师德演讲稿
2014/08/26 职场文书
党员干部批评与自我批评反四风思想汇报
2014/09/21 职场文书
交通违章检讨书
2014/09/21 职场文书
北京爱情故事观后感
2015/06/12 职场文书
首次购房证明
2015/06/19 职场文书
JS数组方法some、every和find的使用详情
2021/10/05 Javascript