相信大部分人学习Python,肯定会用print()这个内置函数,来调试代码的。

那么在一个大型的项目中,如果你也是使用print来调试你的Python代码,你就会发现你的终端有多个输出。

那么你便不得不去分辨,每一行的输出是哪些代码的运行结果。

举个例子,运行下面这个程序。

输出结果

这些输出中哪一个是num1?哪一个又是num2呢?

找出两个输出可能不是很困难,但是如果有五个以上的不同输出呢?尝试查找与输出相关的代码可能会很耗时。

当然你可以在打印语句中添加文本,使其更容易理解:

输出结果

这个结果就很容易理解了,但是需要时间去写相关的信息。

这时就该「Icecream」上场了~

1、什么是Icecream?

Icecream是一个Python第三方库,可通过最少的代码使打印调试更清晰明了。

使用pip安装Icecream库。

pip install icecream

下面,让我们通过打印Python函数的输出来进行尝试。

from icecream import ic def plus_five(num):return num + 5ic(plus_five(4))
ic(plus_five(5))

输出结果如下。

ic| plus_five(4): 9
ic| plus_five(5): 10

通过使用icecream,我们不仅可以看到函数输出,还可以看到函数及其参数!

2、检查执行结果

如果你想要找到执行代码的位置,可以通过执行如下所示的操作,来查找执行了哪个语句。

def hello(user:bool):if user:print("I'm user")else:print("I'm not user")hello(user=True)

输出结果。

I'm user

使用icecream则无需多余的文本信息,就可以轻松地完成上述的操作。

from icecream import ic def hello(user:bool):if user:ic()else:ic()hello(user=True)

输出结果如下。

ic| ice_1.py:5 in hello() at 02:34:41.391

从输出结果看,函数hello中的第5行的代码已被执行,而第7行的代码未执行。

3、自定义前缀

如果您想在打印语句中插入自定义前缀(例如代码执行时间),icecream也是能实现的。

from datetime import datetime
from icecream import ic
import time
from datetime import datetimedef time_format():return f'{datetime.now()}|> 'ic.configureOutput(prefix=time_format)for _ in range(3):time.sleep(1)ic('Hello')

输出结果如下。

2021-01-24 10:38:23.509304|> 'Hello'
2021-01-24 10:38:24.545628|> 'Hello'
2021-01-24 10:38:25.550777|> 'Hello'

4、获取更多的信息

除了知道和输出相关的代码之外,你可能还想知道代码执行的行和代码文件。

在ic.configureOutput()中,设置includeecontext的参数值为True即可

from icecream import ic def plus_five(num):return num + 5ic.configureOutput(includeContext=True)
ic(plus_five(4))
ic(plus_five(5))

输出结果如下。

ic| ice_test.py:7 in <module>- plus_five(4): 9
ic| ice_test.py:8 in <module>- plus_five(5): 10

这里我们就知道了,第一个输出是由函数plus_five在文件ice_test.py的第7行执行的。

第二个输出则是由函数plus_five在代码文件的第8行执行的。

上述两个操作都用到了ic.configureOutput()函数。

通过查看源码,可知有四个可供设置的参数。

  • prefix,自定义输出前缀

  • outputFunction,更改输出函数

  • argToStringFunction,自定义参数序列化字符串

  • includeContext,显示文件名、代码行、函数信息

5、删除Icecream代码

最后你可以将icecream仅用于调试,而将print用于其他目的(例如漂亮的打印)。

from icecream import icdef plus_five(num):return num + 5ic.configureOutput(includeContext=True)
ic(plus_five(4))
ic(plus_five(5))for i in range(10):print(f'****** Training model {i} ******')

输出结果。

ic| ice_1.py:7 in <module>- plus_five(4): 9
ic| ice_1.py:8 in <module>- plus_five(5): 10
****** Training model 0 ******
****** Training model 1 ******
****** Training model 2 ******
****** Training model 3 ******
****** Training model 4 ******
****** Training model 5 ******
****** Training model 6 ******
****** Training model 7 ******
****** Training model 8 ******
****** Training model 9 ******

由于你可以区分调试打印和漂亮打印,因此搜索和删除所有ic调试语句非常容易。

删除所有调试代码后,你的Python代码就整洁了。

python调试神器!今天你吃冰淇淋了吗?相关推荐

  1. 清华校友打造Python调试神器

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 贾浩楠 发自 凹非寺 量子位 报道 | 公众号 QbitAI 写代码 ...

  2. Debug无忧!清华校友打造Python调试神器:反向追踪变量、数据流等 | 开源

    贾浩楠 发自 凹非寺 量子位 报道 | 公众号 QbitAI 写代码时提笔千行,debug时却低效抓狂-- 几乎每个编程者都逃不了这样的纠结. 通过编译器一行行地去找bug,太浪费时间. 所以,一位清 ...

  3. 一个神级般的 Python 调试神器

    贾浩楠 发自 凹非寺 ,  量子位 报道 写代码时提笔千行,debug时却低效抓狂-- 几乎每个编程者都逃不了这样的纠结. 通过编译器一行行地去找bug,太浪费时间. 所以,一位清华校友.谷歌工程师l ...

  4. Debug无忧!清华校友打造Python调试神器

    本文转载自 QbitAI,作者 贾浩楠 写代码时提笔千行,debug时却低效抓狂-- 几乎每个编程者都逃不了这样的纠结. 通过编译器一行行地去找bug,太浪费时间. 所以,一位清华校友.谷歌工程师la ...

  5. 谷歌工程师开源:Python 调试神器 Cyberbrain

    点击上方蓝色小字,关注"涛哥聊Python" 重磅干货,第一时间送达 来源:Python猫 曾多次在<捕蛇者说>播客听到 laike9m 大佬分享他的 Cyberbra ...

  6. python调试神器_python调试神器PySnooper的使用

    相信很多小伙伴平时写python的时候都是需要调试程序的,出问题了,需要了解函数内部是怎么跑的,而这个时候很多人都会想到在疑惑的地方使用print函数来打印一下参数来调试.虽然用print也是不失为是 ...

  7. 你必须拥有的Python调试神器

    今天推荐一个Python调试工具可以让你的调试更快更方便,叫ipdb. 推荐ipdb主要原因:语法高亮和自动补全,因为很多长变量每次打起来很费劲,这个可以大大提高你的效率,避免出错. 知道的朋友都知道 ...

  8. python调试神器_你必须拥有的Python调试神器

    今天推荐一个Python调试工具可以让你的调试更快更方便,叫ipdb. 推荐ipdb主要原因:语法高亮和自动补全,因为很多长变量每次打起来很费劲,这个可以大大提高你的效率,避免出错. 知道的朋友都知道 ...

  9. python调试神器_Python里三个最高逼格的调试神器

    调试是开发过程中不可避免的一个环节,在Python中我们使用print.logging.assert等方法进行调试既简单又实用,但毕竟有其局限性.今天这篇文章为大家带来三个工具,其中有Python的内 ...

最新文章

  1. Linux软件安装通用思路
  2. Gson解析JSON数据中动态未知字段key的方法
  3. 如何在代码中获取Java应用当前的版本号?
  4. Python 技术篇-xlwt库不新建,直接读取已存在的excel并写入
  5. 页面间参数值传递含“%”的处理方法
  6. java当中用UDP实现相互交流
  7. 优酷视频如何进行连续播放?
  8. MySQL(21)--- GROUP BY 语句
  9. spark:SparkUI界面
  10. Session何时创建实例
  11. 听说你不会用datetime处理时间?
  12. 测试电池耗电快的软件,笔记本耗电过快?Win10自带电池检测了解下
  13. PPT制作教程—基础技巧
  14. 20145322何志威 《Java程序设计》第8周学习总结
  15. 如果你的开发板上STM32采用外部晶振,那么就不能选择BYPASS Clock Source (旁路时钟源)模式,否则STM32将会工作不正常。
  16. CyclicBarrier栅栏
  17. select下拉菜单问题
  18. 经纬度查地址与地址查经纬度
  19. 微处理器基本功能及主要性能指标
  20. 如何从官网下载JDK安装包?

热门文章

  1. 该主机cpu类型不支持虚拟化性能计数器,开启模块VPMC的操作失败,未能启动虚拟机。VM12版本的
  2. 【英语词组】恋恋不忘Day4-4
  3. 实验八 查找算法的实现
  4. 汽车驾驶教程(附图解)
  5. 蓝牙 协议 包 java_蓝牙核心技术概述(五):蓝牙协议规范(irOBEX、BNEP、AVDTP、AVCTP)...
  6. 方舟找不到mod服务器了,方舟生存进化灭绝MOD全图文攻略 方舟灭绝MOD上手指南_MOD介绍及服务器设置_游侠网...
  7. linux摄像头 自动对焦,如何实现Android手机摄像头的自动对焦
  8. 【OpenVINO】C#调用OpenVINO部署Al模型项目开发-2.软件安装
  9. java二级考点_计算机二级JAVA考试考点知识
  10. 目标跟踪评价指标-精度Pr、召回率Re