首页 > Python资料 博客日记
扔掉print,用icecream来调试你的代码
2024-03-24 11:30:02Python资料围观155次
print
是我们平时写些python
小工具时,最常用的调试工具。
因为开发代码时,常常通过print
将执行流程、变量的值以及其他关键信息输出到控制台来观察,
以便了解程序执行情况和调试bug
。
但是,print
的输出过于简单,在输出变量内容,函数调用,执行过程等相关信息时,
往往需要自己手动去补充很多的输出信息的说明,否则很容易搞不清输出的内容是什么。
而今天介绍的icecream
,为我们提供了一种更加优雅和强大的方式来调试代码。
它不仅可以自动格式化输出内容,自动添加必要的描述信息,而且使用起来也比print
更加简单。
1. 安装
通过pip
安装:
pip install icecream
安装之后可以通过打印其版本来验证是否安装成功。
2. 使用示例
下面看看icecream
如何替换开发中常见的各种print
场景。
2.1. 调试变量
首先是调试变量,这也是用的最多的场景。
开发中,我们常常需要将变量打印出来以确认是否正确赋值。
print
方式:
# 数值和字符串
i = 100
f = 3.14
s = "abc"
print(i, f, s)
# 元组,列表和字典
t = (10, 20, 30)
l = [1, 2, 3]
d = {"A": "abc", "B": 100}
print(t, l, d)
print(t[0], l[1], d["A"])
# 类
class c:
name = "ccc"
addr = "aa bb cc"
print(c.name, c.addr)
icecream
方式:
from icecream import ic
# 数值和字符串
i = 100
f = 3.14
s = "abc"
ic(i, f, s)
# 元组,列表和字典
t = (10, 20, 30)
l = [1, 2, 3]
d = {"A": "abc", "B": 100}
ic(t, l, d)
ic(t[0], l[1], d["A"])
# 类
class c:
name = "ccc"
addr = "aa bb cc"
ic(c.name, c.addr)
通过比较,可以看出icecream
的几个优势:
- 输入效率更高,因为
ic
比print
更容易输入,只有两个字母。 - 自动带上变量名称,一眼看出打印的是哪个变量的值
- 变量名称和值用不同的颜色显示,容易区分
2.2. 调试函数输出
调试函数输出也是常用的,如果把函数调用也看做一个变量的话,其实这个和上面打印变量类似。print
方式:
def func(a: int, b: int):
return a + b
print(func(2, 3))
icecream
方式:
from icecream import ic
def func(a: int, b: int):
return a + b
ic(func(2, 3))
2.3. 调试执行过程
接下来是调试执行过程,当代码中有很多分支判断时,我们常常是在各个分支中print
不同的数字,
然后用不同的输入看看代码是否按照预期的那样进入不同而分支。
比如,下面构造一个多分支判断的函数,看看分别用print
和icecream
是如何调试的。
print
方式:
def pflow(a: float, b: float):
print(1)
evaluate = ""
if a > 90 and b > 90:
print(2)
evaluate = "优"
elif a > 80 and b > 80:
print(3)
evaluate = "良"
elif a > 70 and b > 70:
print(4)
evaluate = "中"
else:
print(5)
evaluate = "及格"
if a < 60 or b < 60:
print(6)
evaluate = "不合格"
print(7)
return evaluate
pflow(98, 92)
print("---------------------")
pflow(75, 65)
print("---------------------")
pflow(88, 85)
print("---------------------")
pflow(77, 72)
print("---------------------")
pflow(98, 55)
需要根据数字去看看分支执行是否符合预期。
icecream
方式:
from icecream import ic
def flow(a: float, b: float):
ic()
evaluate = ""
if a > 90 and b > 90:
ic()
evaluate = "优"
elif a > 80 and b > 80:
ic()
evaluate = "良"
elif a > 70 and b > 70:
ic()
evaluate = "中"
else:
ic()
evaluate = "及格"
if a < 60 or b < 60:
ic()
evaluate = "不合格"
ic()
return evaluate
flow(98, 92)
ic()
flow(75, 65)
ic()
flow(88, 85)
ic()
flow(77, 72)
ic()
flow(98, 55)
简简单单的一个**ic()**
,会把执行的代码位置和函数名称,执行时间等打印出来。
2.4. 定制化输出
最后,icecream
还提供了强大的定制化接口,可以按照自己的需要调整输出的内容。
首先,我们注意到通过ic()
打印的内容都有一个ic |
前缀,
实际使用时,我们希望将其替换为和项目相关的文字。
比如,我基于manim
做个小动画,希望打印的前缀是 manim |
。
from icecream import ic
def cfg():
ic.configureOutput(prefix="manim -> | ")
ic("something")
cfg()
ic("something")
前缀还可以是动态的,比如用执行时间作为前缀:
from icecream import ic
def cfg():
import time
time_prefix = lambda: time.strftime("%Y-%m-%d %H:%M:%S -> | ", time.localtime())
ic.configureOutput(prefix=time_prefix)
ic("something")
cfg()
ic("something")
除了定义前缀,还可以在输出时添加我们需要的信息。
比如,我们希望打印字符串,列表和字典变量时,顺带输出其长度信息,不用在再去额外打印其长度信息。
from icecream import ic
def add_info(obj):
if isinstance(obj, str) or isinstance(obj, list) or isinstance(obj, dict):
return f"{obj}(len:{len(obj)})"
return repr(obj)
ic.configureOutput(argToStringFunction=add_info)
i = 100
f = 3.14
s = "abc"
ic(i, f, s)
t = (10, 20, 30)
l = [1, 2, 3]
d = {"A": "abc", "B": 100}
ic(t, l, d)
从打印内容可以看出,字符串,列表和字典变量后面有长度len
信息,
而数值变量和元组,则没有打印长度len
信息。
同样,在数据分析时,也可以通过定制,
让我们打印pandas
的DataFrame
内容时,顺带打印出其shape
信息。
import pandas as pd
def add_info(obj):
if isinstance(obj, pd.DataFrame):
return f"{obj}\nshape:{obj.shape}"
return repr(obj)
df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]})
ic(df)
3. 总结
总的来说,icecream
提供了一种更加现代和高效的调试方式,让我们更关注需要打印的内容,不用去操心打印的格式。
除了python
,icecream
还有一系列其他语言的接口:
- Dart: icecream
- Rust: icecream-rs
- Node.js: node-icecream
- C++: IceCream-Cpp
- C99: icecream-c
- PHP: icecream-php
- Go: icecream-go
- Ruby: Ricecream
- Java: icecream-java
- R: icecream
- Lua: icecream-lua
- Clojure(Script): icecream-cljc
- Bash: IceCream-Bash
标签:
相关文章
最新发布
- 【Python】selenium安装+Microsoft Edge驱动器下载配置流程
- Python 中自动打开网页并点击[自动化脚本],Selenium
- Anaconda基础使用
- 【Python】成功解决 TypeError: ‘<‘ not supported between instances of ‘str’ and ‘int’
- manim边学边做--三维的点和线
- CPython是最常用的Python解释器之一,也是Python官方实现。它是用C语言编写的,旨在提供一个高效且易于使用的Python解释器。
- Anaconda安装配置Jupyter(2024最新版)
- Python中读取Excel最快的几种方法!
- Python某城市美食商家爬虫数据可视化分析和推荐查询系统毕业设计论文开题报告
- 如何使用 Python 批量检测和转换 JSONL 文件编码为 UTF-8
点击排行
- 版本匹配指南:Numpy版本和Python版本的对应关系
- 版本匹配指南:PyTorch版本、torchvision 版本和Python版本的对应关系
- Python 可视化 web 神器:streamlit、Gradio、dash、nicegui;低代码 Python Web 框架:PyWebIO
- 相关性分析——Pearson相关系数+热力图(附data和Python完整代码)
- Python与PyTorch的版本对应
- Anaconda版本和Python版本对应关系(持续更新...)
- Python pyinstaller打包exe最完整教程
- Could not build wheels for llama-cpp-python, which is required to install pyproject.toml-based proj