python调试神器!今天你吃冰淇淋了吗?
相信大部分人学习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调试神器!今天你吃冰淇淋了吗?相关推荐
- 清华校友打造Python调试神器
点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 贾浩楠 发自 凹非寺 量子位 报道 | 公众号 QbitAI 写代码 ...
- Debug无忧!清华校友打造Python调试神器:反向追踪变量、数据流等 | 开源
贾浩楠 发自 凹非寺 量子位 报道 | 公众号 QbitAI 写代码时提笔千行,debug时却低效抓狂-- 几乎每个编程者都逃不了这样的纠结. 通过编译器一行行地去找bug,太浪费时间. 所以,一位清 ...
- 一个神级般的 Python 调试神器
贾浩楠 发自 凹非寺 , 量子位 报道 写代码时提笔千行,debug时却低效抓狂-- 几乎每个编程者都逃不了这样的纠结. 通过编译器一行行地去找bug,太浪费时间. 所以,一位清华校友.谷歌工程师l ...
- Debug无忧!清华校友打造Python调试神器
本文转载自 QbitAI,作者 贾浩楠 写代码时提笔千行,debug时却低效抓狂-- 几乎每个编程者都逃不了这样的纠结. 通过编译器一行行地去找bug,太浪费时间. 所以,一位清华校友.谷歌工程师la ...
- 谷歌工程师开源:Python 调试神器 Cyberbrain
点击上方蓝色小字,关注"涛哥聊Python" 重磅干货,第一时间送达 来源:Python猫 曾多次在<捕蛇者说>播客听到 laike9m 大佬分享他的 Cyberbra ...
- python调试神器_python调试神器PySnooper的使用
相信很多小伙伴平时写python的时候都是需要调试程序的,出问题了,需要了解函数内部是怎么跑的,而这个时候很多人都会想到在疑惑的地方使用print函数来打印一下参数来调试.虽然用print也是不失为是 ...
- 你必须拥有的Python调试神器
今天推荐一个Python调试工具可以让你的调试更快更方便,叫ipdb. 推荐ipdb主要原因:语法高亮和自动补全,因为很多长变量每次打起来很费劲,这个可以大大提高你的效率,避免出错. 知道的朋友都知道 ...
- python调试神器_你必须拥有的Python调试神器
今天推荐一个Python调试工具可以让你的调试更快更方便,叫ipdb. 推荐ipdb主要原因:语法高亮和自动补全,因为很多长变量每次打起来很费劲,这个可以大大提高你的效率,避免出错. 知道的朋友都知道 ...
- python调试神器_Python里三个最高逼格的调试神器
调试是开发过程中不可避免的一个环节,在Python中我们使用print.logging.assert等方法进行调试既简单又实用,但毕竟有其局限性.今天这篇文章为大家带来三个工具,其中有Python的内 ...
最新文章
- Linux软件安装通用思路
- Gson解析JSON数据中动态未知字段key的方法
- 如何在代码中获取Java应用当前的版本号?
- Python 技术篇-xlwt库不新建,直接读取已存在的excel并写入
- 页面间参数值传递含“%”的处理方法
- java当中用UDP实现相互交流
- 优酷视频如何进行连续播放?
- MySQL(21)--- GROUP BY 语句
- spark:SparkUI界面
- Session何时创建实例
- 听说你不会用datetime处理时间?
- 测试电池耗电快的软件,笔记本耗电过快?Win10自带电池检测了解下
- PPT制作教程—基础技巧
- 20145322何志威 《Java程序设计》第8周学习总结
- 如果你的开发板上STM32采用外部晶振,那么就不能选择BYPASS Clock Source (旁路时钟源)模式,否则STM32将会工作不正常。
- CyclicBarrier栅栏
- select下拉菜单问题
- 经纬度查地址与地址查经纬度
- 微处理器基本功能及主要性能指标
- 如何从官网下载JDK安装包?
热门文章
- 该主机cpu类型不支持虚拟化性能计数器,开启模块VPMC的操作失败,未能启动虚拟机。VM12版本的
- 【英语词组】恋恋不忘Day4-4
- 实验八 查找算法的实现
- 汽车驾驶教程(附图解)
- 蓝牙 协议 包 java_蓝牙核心技术概述(五):蓝牙协议规范(irOBEX、BNEP、AVDTP、AVCTP)...
- 方舟找不到mod服务器了,方舟生存进化灭绝MOD全图文攻略 方舟灭绝MOD上手指南_MOD介绍及服务器设置_游侠网...
- linux摄像头 自动对焦,如何实现Android手机摄像头的自动对焦
- 【OpenVINO】C#调用OpenVINO部署Al模型项目开发-2.软件安装
- java二级考点_计算机二级JAVA考试考点知识
- 目标跟踪评价指标-精度Pr、召回率Re