相信很多小伙伴平时写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的值就会抛异常

作者:吃鱼益智
链接:https://www.jianshu.com/p/d26bf8950b59
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Python 调试工具PySnooper的更多相关文章

  1. 一个牛逼的 Python 调试工具PySnooper

    原文转自:https://mp.weixin.qq.com/s/OtLr-cNethboMgmCcUx2pA PySnooper 使用起来十分简单,开发者可以在任何庞大的代码库中使用它,而无需进行任何 ...

  2. 我常用的 Python 调试工具 - 博客 - 伯乐在线

    .ckrating_highly_rated {background-color:#FFFFCC !important;} .ckrating_poorly_rated {opacity:0.6;fi ...

  3. Python调试工具

    1. 日志 通过日志或者print来打印变量.必要时可以打印locals()和globals() 建议使用logging.debug()来代替print,这样到了正式环境,就可以统一删除这些日志. 2 ...

  4. python调试工具pdb

    pdb是基于命令行的调试工具,非常类似gnu的gdb(调试c/c++). 命令 简写命令 作用 break b 设置断点 continue c 继续执行程序 list l 查看当前行的代码段 step ...

  5. Python调试工具-Spyder

    OS:Windows 7 关键字:Python IDE, Spyder 1.安装工具pip:https://pip.pypa.io/en/latest/installing.html 下载 get-p ...

  6. 常用的 Python 调试工具,Python开发必读-乾颐堂

    以下是我做调试或分析时用过的工具的一个概览.如果你知道有更好的工具,请在评论中留言,可以不用很完整的介绍. 日志 没错,就是日志.再多强调在你的应用里保留足量的日志的重要性也不为过.你应当对重要的内容 ...

  7. python调试工具remote_pdb

    介绍一个调试python代码的工具:remote_pdb https://pypi.org/project/remote-pdb/ 安装 pip install remote-pdb 使用 1,设置断 ...

  8. python 调试工具

    https://github.com/what-studio/profiling http://blog.jobbole.com/51062/ http://blog.jobbole.com/5209 ...

  9. python调试工具----pycharm快捷键及一些常用设置

    pycharm快捷键及一些常用设置 Alt+Enter 自动添加包Ctrl+t SVN更新Ctrl+k SVN提交Ctrl + / 注释(取消注释)选择的行Ctrl+Shift+F 高级查找Ctrl+ ...

随机推荐

  1. Netty搭建服务端的简单应用

    Netty简介 Netty是由JBOSS提供的一个java开源框架,现为 Github上的独立项目.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客 ...

  2. vue 后台获取文件流导出excel文件

    let params = { compStartTm: Date.parse(this.searchForm.compStartTm) / 1000, compEndTm: Date.parse(th ...

  3. httprunner---->最最基础小白笔记

    1.安装httprunner         pip install httprunner 2.cmd 执行hrun  --startproject Api_api 出现了: 3.Fiddler抓包后 ...

  4. Dapper+Mysql 使用LIKE模糊查询写法踩坑

    LIKE '%@Title%' 会解析成'%'@Title'%' 这里用拼接也是不行的'%'+@Title+'%' 只能用MySQL函数方法拼接 public dynamic GetListByFil ...

  5. Spark1

    Spark集群 0.0体验安装Spark在集群单节点 1.tar tar -xzvf xxx.tgz -C /soft/ ln -s /soft/spark-2.1.0-bin-hadoop2.7 / ...

  6. 3、获取Class对象的三种方式

    3.获取Class对象的三种方式 要想对字节码文件进行解刨,必须要有字节码文件对象 Object类中的getClass方法 通过对象静态属性 .class来获取对应的Class对象 只要通过给定类的字 ...

  7. electron 打包成桌面运用

    最近在学习nodejs,得知Electron是通过将Chromium和Node.js合并到同一个运行时环境中,用HTML,CSS和JavaScript来构建跨平台桌面应用程序的一门技术.对于之前一直从 ...

  8. Web应用运行原理

    web应用启动做了什么? 读取web.xml文件   - web.xml常用配置参数: 1).context-param(上下文参数)2).listener(监听器配置参数)3).filter(过滤器 ...

  9. MySQL B+树 的插入与删除

    一.MySQL Index 的插入 有如下B+树,其高度为2,每页可存放4条记录,扇出为5.所有记录都在叶子节点上, 并且是顺序存放,如果用户从最左边的叶子节点开始顺序遍历,可以得到所有简直的顺序 排 ...

  10. 基于ARM的SoC设计入门[转]

    原文:基于ARM的SoC设计入门 我们跳过所有对ARM介绍性的描述,直接进入工程师们最关心的问题.要设计一个基于ARM的SoC,我们首先要了解一个基于ARM的SoC的结构.图1是一个典型的SoC的结构 ...