扔掉print,用icecream来调试你的代码

这篇具有很好参考价值的文章主要介绍了扔掉print,用icecream来调试你的代码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

print是我们平时写些python小工具时,最常用的调试工具。
因为开发代码时,常常通过print将执行流程、变量的值以及其他关键信息输出到控制台来观察,
以便了解程序执行情况和调试bug

但是,print的输出过于简单,在输出变量内容,函数调用,执行过程等相关信息时,
往往需要自己手动去补充很多的输出信息的说明,否则很容易搞不清输出的内容是什么。

而今天介绍的icecream,为我们提供了一种更加优雅和强大的方式来调试代码。
它不仅可以自动格式化输出内容,自动添加必要的描述信息,而且使用起来也比print更加简单。

1. 安装

通过pip安装:

pip install icecream

安装之后可以通过打印其版本来验证是否安装成功。
扔掉print,用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)

扔掉print,用icecream来调试你的代码

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)

扔掉print,用icecream来调试你的代码

通过比较,可以看出icecream的几个优势:

  1. 输入效率更高,因为icprint更容易输入,只有两个字母。
  2. 自动带上变量名称,一眼看出打印的是哪个变量的值
  3. 变量名称和值用不同的颜色显示,容易区分

2.2. 调试函数输出

调试函数输出也是常用的,如果把函数调用也看做一个变量的话,其实这个和上面打印变量类似。
print方式:

def func(a: int, b: int):
    return a + b

print(func(2, 3))

扔掉print,用icecream来调试你的代码

icecream方式:

from icecream import ic

def func(a: int, b: int):
    return a + b

ic(func(2, 3))

扔掉print,用icecream来调试你的代码

2.3. 调试执行过程

接下来是调试执行过程,当代码中有很多分支判断时,我们常常是在各个分支中print不同的数字,
然后用不同的输入看看代码是否按照预期的那样进入不同而分支。
比如,下面构造一个多分支判断的函数,看看分别用printicecream是如何调试的。

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)

扔掉print,用icecream来调试你的代码
需要根据数字去看看分支执行是否符合预期。

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)

扔掉print,用icecream来调试你的代码
简简单单的一个**ic()**,会把执行的代码位置和函数名称,执行时间等打印出来。

2.4. 定制化输出

最后,icecream还提供了强大的定制化接口,可以按照自己的需要调整输出的内容。

首先,我们注意到通过ic()打印的内容都有一个ic | 前缀,
实际使用时,我们希望将其替换为和项目相关的文字。
比如,我基于manim做个小动画,希望打印的前缀是 manim |

from icecream import ic

def cfg():
    ic.configureOutput(prefix="manim -> | ")

ic("something")
cfg()
ic("something")

扔掉print,用icecream来调试你的代码

前缀还可以是动态的,比如用执行时间作为前缀:

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")

扔掉print,用icecream来调试你的代码

除了定义前缀,还可以在输出时添加我们需要的信息。
比如,我们希望打印字符串列表字典变量时,顺带输出其长度信息,不用在再去额外打印其长度信息。

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)

扔掉print,用icecream来调试你的代码
从打印内容可以看出,字符串列表字典变量后面有长度len信息,
而数值变量和元组,则没有打印长度len信息。

同样,在数据分析时,也可以通过定制,
让我们打印pandasDataFrame内容时,顺带打印出其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)

扔掉print,用icecream来调试你的代码

3. 总结

总的来说,icecream 提供了一种更加现代和高效的调试方式,让我们更关注需要打印的内容,不用去操心打印的格式。

除了pythonicecream还有一系列其他语言的接口:文章来源地址https://www.toymoban.com/news/detail-842908.html

  • 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

到了这里,关于扔掉print,用icecream来调试你的代码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 你的设备遇到问题,需要重启;我们只收集某些错误信息,然后为你重新启动。

    VMware安装centos和打开其他虚拟机时电脑蓝屏报错: 你的设备遇到问题,需要重启;我们只收集某些错误信息,然后为你重新启动。 我的解决办法:开启Windows的虚拟机平台 打开控制面板,点击“程序”,点击“启用或关闭windows功能”,勾选“虚拟机平台”

    2024年02月11日
    浏览(177)
  • 【已解决】ThinkPad X1 Carbon 我们找不到你的相机 更新驱动程序显示安装错误 - 0x80070103

    打微信视频通话发现自己电脑的摄像头出问题了,对方显示不了我这边的画面。我点开自己的相机,显示如下: 装两个摄像头相关的驱动程序 我装了,重启系统,发现相机可以使用了,拍了张照片,美滋滋。但是一点相册,完犊子,电脑直接蓝屏重启。 我觉得可能是驱动程

    2024年01月16日
    浏览(182)
  • 全面解析 Postman 网页版的使用,提升你的 API 调试技能!

    Postman是一款流行的API开发工具,可以帮助开发者优化工作流程。除了客户端,Postman还支持网页版访问,让用户能够从任何网页浏览器中访问该工具。在本篇文章中,我们将详细介绍如何使用Postman的网页版。 要访问Postman网页版,首先,我们需要进入Postman的官网。 进入网站,

    2024年03月16日
    浏览(38)
  • 【Python童年游戏】满满的回忆杀—那些年玩过的童年游戏你还记得吗?那个才是你的菜?看到第一个我就泪奔了(致我们逝去的青春)

    滴一一学生卡🙌 结伴上车的学生仔子们 用笑声打破车厢的沉默 大人眼里的晚高峰 是给放学后快乐😀时光的加时 下车的学生匆匆起身带起 一阵熟悉的栀子香于💓 是关于校园的记忆 开始零零散散地闪现 放学后集合的秘密基地/跟着城市变了模样 超级马里奥里的隐藏地图😁

    2023年04月09日
    浏览(28)
  • 扔掉抽象难懂专业名词,带你从头开始理解入门动态规划1

    注:并非指专业名词概念不好,而是认为乍一接触dp就开始啃那些难得名词比较容易劝退,这里用简单的思维理解来了解入门dp。 1.动态规划是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。 2.由于动态规划并不是某种具体的算法,而是一种解决特定问

    2024年02月03日
    浏览(29)
  • 旧手机不要轻易扔掉,将其设置为无线网卡,不消耗流量

    如果你有一部旧手机正在闲置着,或者正考虑要将其丢弃,那么请暂停一下。因为这个旧手机可以成为你的无线网卡,帮助你在家中或出行时实现更快的网络下载速度,而且毫不费流量。接下来,我将告诉你如何将旧手机变成无线网卡,让你的网络速度瞬间提升。 在将旧手机

    2024年02月11日
    浏览(28)
  • 什么是低代码?我们该如何去避免?

    低代码开发是近年来迅速崛起的软件开发方法,让编写应用程序变得更快、更简单。有人说它是美味的膳食,让开发过程高效而满足,但也有人质疑它是垃圾食品,缺乏定制性与深度。你认为低代码到底是美味的膳食还是垃圾食品呢,来分享一下吧! 低代码是指一种软件开发

    2024年02月03日
    浏览(32)
  • 扔掉okhttp、httpClient,这款轻量级 HTTP 神器好用到爆

    前言 功能特性 快速使用 HTTP请求相关注解 配置项说明 高级功能 全局拦截器 调用适配器和数据转码器 总结 在 SpringBoot 项目直接使用 okhttp 、 httpClient 或者 RestTemplate 发起 HTTP 请求,既繁琐又不方便统一管理。因此,在这里推荐一个适用于 SpringBoot 项目的轻量级HTTP客户端框架

    2024年02月07日
    浏览(58)
  • 低代码平台活字格,让我们一起感受低代码平台活字格的魅力

    一份耕耘,一份收获,一段工作经历,让我认识了活字格。感觉活字格绝对是同类产品中的佼佼者。简单的拖拉拽,就实现一个完美的WEB页面,并且可做到前后端分离与交互。有了他,不擅长前端的我,也能大显身手了。告别VUE,我选活字格。用它做原型,绝对胜过Axure ,用它来

    2024年02月06日
    浏览(43)
  • git代码合并了后发现有冲突,我们怎么取消合并?

    git代码合并了后发现有冲突,我们有时候不想解决冲突,不想合并了;或者别人把冲突解决完了,自己想拉取一下最新代码,咋办呢? 使用命令行

    2024年02月16日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包