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学习笔记(二)基础语法
Jun 06 Python
使用graphics.py实现2048小游戏
Mar 10 Python
python使用reportlab实现图片转换成pdf的方法
May 22 Python
Python+Wordpress制作小说站
Apr 14 Python
Python爬虫实例_利用百度地图API批量获取城市所有的POI点
Jan 10 Python
python中返回矩阵的行列方法
Apr 04 Python
python 动态生成变量名以及动态获取变量的变量名方法
Jan 20 Python
详解将Python程序(.py)转换为Windows可执行文件(.exe)
Jul 19 Python
django认证系统 Authentication使用详解
Jul 22 Python
Python中断多重循环的思路总结
Oct 04 Python
Django 删除upload_to文件的步骤
Mar 30 Python
python操作yaml说明
Apr 08 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/03/04 星际争霸
咖啡店都有些什么常规豆子呢?有什么风味在里面
2021/03/04 咖啡文化
php数组声明、遍历、数组全局变量使用小结
2013/06/05 PHP
php像数组一样存取和修改字符串字符
2014/03/21 PHP
PHP邮件发送类PHPMailer用法实例详解
2014/09/22 PHP
php实现过滤字符串中的中文和数字实例
2015/07/29 PHP
WordPress中对访客评论功能的一些优化方法
2015/11/24 PHP
PHP根据session与cookie用户登录状态操作类的代码
2016/05/13 PHP
出现“不能执行已释放的Script代码”错误的原因及解决办法
2007/08/29 Javascript
JS+CSS实现的漂亮渐变背景特效代码(6个渐变效果)
2016/03/25 Javascript
深入理解JS中的substr和substring
2016/04/26 Javascript
Google 地图类型详解及示例代码
2016/08/06 Javascript
js生成随机颜色方法代码分享(三种)
2016/12/29 Javascript
vue组件实例解析
2017/01/10 Javascript
javascript 中的try catch应用总结
2017/04/01 Javascript
浅谈Vuex的状态管理(全家桶)
2017/11/04 Javascript
微信小程序实现音乐播放器
2019/11/20 Javascript
React生命周期原理与用法踩坑笔记
2020/04/28 Javascript
vue相关配置文件详解及多环境配置详细步骤
2020/05/19 Javascript
Javascript实现关闭广告效果
2021/01/29 Javascript
python实现zencart产品数据导入到magento(python导入数据)
2014/04/03 Python
Python简单计算文件夹大小的方法
2015/07/14 Python
浅析Python的Django框架中的Memcached
2015/07/23 Python
Linux上安装Python的PIL和Pillow库处理图片的实例教程
2016/06/23 Python
Python入门_浅谈字符串的分片与索引、字符串的方法
2017/05/16 Python
python 提取key 为中文的json 串方法
2018/12/31 Python
python树莓派红外反射传感器
2019/01/21 Python
Django框架模板的使用方法示例
2019/05/25 Python
如何理解Python中的变量
2020/06/01 Python
阿迪达斯芬兰官方网站:adidas芬兰
2017/01/30 全球购物
美国在线面料商店:Online Fabric Store
2018/07/26 全球购物
英国Radley包德国官网:Radley London德国
2019/11/18 全球购物
住宅使用说明书
2014/05/09 职场文书
管理失职检讨书
2015/05/05 职场文书
员工手册编写范本
2015/05/14 职场文书
vue实现省市区联动 element-china-area-data插件
2022/04/22 Vue.js