社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

一文带您了解IceCream:码农的Python代码调试神器,告别print()

新语数据故事汇 • 10 月前 • 268 次点击  

编程过程中不可避免地会出现各种各样的错误,码农们都需要花费了大量时间来调试程序,以确保代码能正常没有错误运行。在调试过程中,使用print()语句来输出代码执行过程的各种变量以便于发现逻辑问题,print是最广泛采用的调试方法。

python使用print()有许多缺点,比如:

  1. Print语句通常用于向用户显示变量及输出。如果码农们使用print()进行调试,调试结束后,码农们还需要小心翼翼的删除仅用于调试的特定print()语句。

  2. 在调试过程中,通常会连续打印多个变量。在这种情况下,码农们必须手动格式化输出以增强其可读性。

比如上面输出两个变量的示例,尽管在这里我们知道第一个变量是var_1,第二个是var_2,但随着变量数量的增加,可能需要你来回比对代码和输出,才能确定哪个输出对应哪个变量。我们可以打印更多的细节,就像下面这样,会增加不少工作量。

有时可能还需要对打印行号、函数名称及其输入等感兴趣,这增加了编写长/多个print()语句的复杂性。

在大多数情况下,代码库不仅限于一个文件,而是有多个文件组成包。在这种情况下,人们可能在调试时对显示文件名也感兴趣,但使用print()可能会很麻烦。以上原因使得print()对我们程序员来说至少是最糟糕的调试选项。

IceCream 正是为解决print在程序代码调试过程痛点而生的python库,接下了结合示例介绍一下IceCream。

IceCream — Never use print() to debug again

IceCream,或简称ic,让print 调试变得更加愉快。完美替换print()或log()来调试你的代码。

ic()就像print(),但更好:

  • 它打印表达式/变量名称及其值。

  • 键入速度快60%。

  • 数据结构被漂亮地打印。

  • 输出语法高亮显示。

  • 它可选择包括程序上下文:文件名、行号和父函数。

安装 IceCream

pip install icecream

检查变量(Inspect Variables)

Icecream在调试时自动打印变量及其值。例如:

from   icecream import icx,y=10,20ic(x,y)

函数、字典和属性等都可以输出对应的名称和值:

from icecream import ic
def foo(i): return i + 333
ic(foo(123))
d = {'key': {1: 'one'}}ic(d['key'][1])
class klass(): attr = 'yep' ic(klass.attr)

检查执行(Inspect Execution)

你是否曾经使用print()来确定程序的哪些部分被执行,以及它们被执行的顺序?ic()也在这方面提供帮助。不带参数时,ic()会检查自身,并打印调用的文件名、行号和父函数。例如:

from icecream import ic
def func(input_num): if input_num == 1: ic() ... else: ... ic() ...
func(1)func(2)

返回值(Return Value)

ic()会返回它的参数,因此ic()可以轻松地插入到现有的代码中。

a = 6
def half(i): return i / 2
b = half(ic(a))
ic(b)

配置(Configuration)

ic.configureOutput(prefix, outputFunction, argToStringFunction, includeContext, contextAbsPath) 控制 ic() 的输出。

prefix:前缀,如果提供,采用自定义的输出前缀。前缀可以是一个字符串,也可以是函數,例如:

ic.configureOutput(prefix='snb: ')
ic("hello world")
from datetime import datetimedef prefix_datetime(): return '%s > ' % datetime.now()
ic.configureOutput(prefix=prefix_datetime)
ic("hello world")

outputFunction,如果提供,会在每次调用ic()时被调用,参数是ic()的输出字符串,而不是将该字符串写入到 stderr(默认行为)。

import loggingfrom icecream import ic
def warn(s): logging.warning(s)
ic.configureOutput(outputFunction=warn)ic('eep')

停用(disable)

使用ic.disable()来停止ic()的输出打印。如果希望再次输出,使用ic.enable()。

from icecream import ic
ic.disable()ic('eep')
print("*"*30)
ic.enable()ic('eep')

使用print()语句进行调试是一种混乱而不够优雅的方法。将输出映射到相应的调试语句是令人困惑的。此外,它需要额外的手动格式化来理解输出。Python中的IceCream库是一个很好的替代方案。它使得调试变得轻松而可读,代码量也最小化。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/167697
 
268 次点击