Python: 告别Print?优秀的Debug神器---pysnooper

相信小伙伴在调试程序时,出问题了,需要了解函数内部是怎么跑的?想知道哪些行正在运行?哪些没有运行?以及局部变量的值是什么?大多数人会选择在疑惑的地方使用print函数来打印一下参数来调试。

虽然用print也不失为是一种方法,但是有时如果疑惑的地方多就要每个地方都要加print,这样就显得比较麻烦了。

Github开源了一个神器---PySnooper,允许和print执行相同的操作,只需向感兴趣的函数添加一个装饰器行,而不是小心地创建正确的打印行。将会得到函数的详细日志,包括运行了哪些行、何时运行、以及何时更改了局部变量

1.传统采用print进行debug的方式

print在计算机编程中,应该算是使用最为频繁的一种操作。无论是C语言中的printf,还是C++中的cout,还是python中的print,都是为了向控制台打印输出。

每一个入门编程的小伙伴都绕不过的坎,就是输出一个字符串“Hello World”,在python中是很简单的一句话,如下这样:

print('Hello World')

不仅仅是刚刚入门的小伙伴需要采用print函数打印查看输出,经验丰富的大牛在工作中也要经常性的打印出中间变量,判断是否和预想的输出结果一致,间接的判断程序中是否存在语句的错误。

使用Print进行调试的好处是非常直白,易于上手,但是弊端也是明显的:

1.如果要打印的信息比较多,就需要写很多行的Print语句;2.在调试结束后,往往还需要逐一删除这些语句。这是一个繁琐的过程。一言以蔽之,使用Print调试的缺点是效率较低。如下,展示了我们在debug代码时候,使用print查看参数最常用的方式:

def removeDuplicates(nums): ''' :type nums: List[int] :rtype: int ''' flag = 0 i = 1 while i < len(nums): # len(nums)=4 if nums[i] == nums[i - 1]: # 相邻两个相等 flag += 1 i += 1 print('flag=',flag) print('i=', i) if flag >= 2: del nums[i - 1] # 如果flag大于等于2,就从列表num是中删除第i-1个元素 i -= 1 print('i=',i) print('nums=',nums) else: print('else') i += 1 flag = 0 return len(nums)nums = [1, 1, 1, 2]print(removeDuplicates(nums))

输出打印的结果,如下:

2.pysnooper神器的打印方式

PySnooper - Never use print for debugging again

上面一句是引用自Github中pysnooper作者在介绍中的代言句,“再也不用print去debug了”,pysnooper---英文解释是“刺探者,实时录音软件”,名字和它的功能一样,像一个窥探者似的,记录下了整个运行的日志过程。

接下来,我们就直接将章节1中的代码print部分注释掉,其余部分不变,增加pysnooper部分,看看声称要取代print进行代码调试的它究竟有多么的强大。如下

import pysnooper@pysnooper.snoop()def removeDuplicates(nums): flag = 0 i = 1 while i < len(nums): # len(nums)=4 if nums[i] == nums[i - 1]: # 相邻两个相等 flag += 1 i += 1 if flag >= 2: del nums[i - 1] # 如果flag大于等于2,就从列表num是中删除第i-1个元素 i -= 1 else: i += 1 flag = 0 return len(nums)nums = [1, 1, 1, 2]print(removeDuplicates(nums))

打印结果如下:

  1. 色框部分,是该debug的时候,运行到哪一行了
  2. 蓝色、绿色、黄色框,则是运行过程中参数的值
  3. 红色框右侧则是运行到该行,执行的代码行

上面执行的这些,也就和在章节1中自行打印的参数值内容一致,采用pysnooper方法会更加的直观如果你不容易访问stderr,你可以重定向输出保存到一个文件中:

import pysnooper#@pysnooper.snoop()@pysnooper.snoop('file.log')

定义函数部分是一样的,然后运行,查看file.log,内容如下:

仔细的查看每一行打印的日志内容,就可以知道此时运行到哪一行了,以及该行的代码详细内容,和当前参数的值。最后,送上安装方式,也是非常的简单,不报错。

pip install pysnooper

如果出现安装超时的情况,多半是由于你安装源的问题,这里我们就可以切换到国内的安装源进行尝试下。如下,切换到豆瓣的安装源(该方法同样适用于以后的第三方库的安装过程):

pip install pysnooper -i https://pypi.douban.com/simple

作者很用心的列举了很多的例子,限于篇幅不一一介绍了。更多的关于pysnooper的内容,可直接去大佬github查看,现在已经12.6K赞啦:https://github.com/cool-RR/PySnooper

好用,就赶紧收藏起来吧。

下期预告

1.【Git笔记1】本地项目与GitHub远程仓库互联

2.【Git笔记2】必知习惯和如何版本回退

3.【Git笔记3】关于撤销、删除、恢复的那些事儿

4.现在,就要对文件的批操作,动刀子啦!!!

5.小白CV的原创整理及毛遂自荐

小白CV将在第一时间发布CV/AI新动态,整理好文章

(最近会更加关注数据处理,欢迎点赞收藏)

(0)

相关推荐

  • 笔试编程框架总结!

    每日干货 & 每月组队学习,不错过  Datawhale干货  作者:吴忠强,东北大学,Datawhale成员 前面的话 经历面试前,我一直埋头刷题,到了面试才发现,没有一套应对真实环境的编程 ...

  • python怎么判断三个数的大小

    前言 大部分初学编程的人来说刚开始都会练习判断两个数或者三个数的大小,来熟悉某种语言的特性和最基本的if,else循环,当我们学习了更高级的语法知识后,又会有不同的实现方式,比如这道练习题依次接收用户 ...

  • Python标准库模块之heapq

    该模块提供了堆排序算法的实现.堆是二叉树,最大堆中父节点大于或等于两个子节点,最小堆父节点小于或等于两个子节点. 创建堆 heapq有两种方式创建堆, 一种是使用一个空列表,然后使用heapq.hea ...

  • 求你了,别再用 print 调试代码了

    大家好,我是小五. 对于每个程序开发者来说,调试几乎是必备技能.代码写到一半卡住了,不知道这个函数执行完的返回结果是怎样的?调试一下看看代码运行到一半报错了,什么情况?怎么跟预期的不一样?调试一下看看 ...

  • 数组中的map方法

    作用:通过指定函数对数组进行处理,并将处理后的结果以新数组的形式返回 注意点:不会改变原数组,只是将处理后的结果以新数组的形式返回 参数:该方法可以接收两个参数 第一个参数是函数,数组中的每个元素都会 ...

  • Python中基础使用及Numpy、Scipy、Matplotlib 使用教程

    本文主要根据 斯坦福CS231n课程的Python 教程进行整理,原文地址为http://cs231n.github.io/python-numpy-tutorial/,官方Python指南网址htt ...

  • Python高阶函数

    该篇中主要介绍什么是高阶函数,高阶函数的用法以及几个常见的内置的高阶函数. 什么是高阶函数? 高阶函数:一个函数可以作为参数传给另外一个函数,或者一个函数的返回值为另外一个函数(若返回值为该函数本身, ...

  • 奇技淫巧,还是正统功夫? - Python推导式最全用法

    作者:麦叔 源自:麦叔编程 1 Pythonic - 很Python 写一段代码生成1到100之间的数字的平方的列表,答案是: 1,4,9,16... 如果你这样写,你就不Pythonic了: num ...

  • python测试开发django-97.设置DEBUG = False后静态资源不显示问题

    前言 设置DEBUG = False后,访问web页面,发现静态资源不显示,无法加载到静态资源. 问题描述 django 项目部署正式环境,设置DEBUG = False后,访问admin后台页面,页 ...

  • 我用Python开发了一个搜题神器

    专业搜题,家长好帮手 很早之前曾经做过一个图片识别的项目,当时有一项功能是整题识别,即传入数学题的截图,可通过ocr技术识别出图片内容,但当时只限于识别文字,并未作更深一步的处理,现在想来实用性并不强 ...

  • 推荐一款 Python 数据分析报告开发与分享神器

    呆鸟云: ''' Python 的数据分析能力已经被大家充分认可了.处理数据的 Pandas,绘制可视图的 Matplotlib,生成交互图的 Bokeh,实现机器学习的 Scikit-learn 等 ...

  • 9款强大的Python工具包,第5款神器期待已久!

    转自:七步编程 Python是一门简洁.优美且强大的编程语言,它的强大,很大一部分原因来自于丰富的第三方工具包. 通过这些第三方工具包,它可以轻松应对机器学习.数据分析.前端.后端等不同种类的需求和工 ...

  • Python中print()本质与sys.stdout.write()区别

    在Python中print()命令普通常见,其本质是怎么运行的?估计知道的人不多- print语句实现打印,技术上来说就是把一个或多个对象转换为其文本表达式形式,然后发送给标准输出流或者类似的文件流. ...

  • Python输出函数print()总结(python print())

    python版本:python3.5.1 ; IDE:pycharm2017.2 目录 一.print()函数概述 二.变量的输出 三.数据的格式化输出 3.1 %字符 3.2 最小字段宽度和精度 3 ...

  • Python 这样 print 才够骚啊

    我们在玩 Python 的时候 常常会使用到 print 这个函数 主要用它来打印一些输出 这样我们可以更加方便的知道 程序的运行情况 我们常常这样操作 不过不是很骚 有时候我们想更加直观的看到 我们 ...

  • python 这样 print 才够骚啊 (2)

    前不久 给大家说了下 print 的骚操作 Python 这样 print 才够骚啊 就是一顿花里胡哨 整得不要不要的 按照传统的美德 今天 咱们就延续 print 的骚 give some colo ...

  • python 这样 print 才够骚啊 (3)

    是这样的 本来我是没打算继续写花里胡哨 print 的 不过有位 b 友跟我说 可以写 <这样 print 才够骚啊 (3)>了 因为他发现了一个也是能够让 print 骚起来的库 于是我 ...