调试Python代码,不要再用print了!

Python绿色通道

共 3176字,需浏览 7分钟

 ·

2021-02-06 08:51

↑ 关注 + 星标 ,每天学Python新技能

后台回复【大礼包】送你Python自学大礼包


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


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


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


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


num1 = 30
num2 = 40 

print(num1)
print(num2)


输出结果。


30
40


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


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


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


num1 = 30
num2 = 40 

print("num1" num1)
print("num2" num1)


输出结果。


num1 30
num2 40


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


这时就该「Icecream」上场了~



01. 什么是Icecream?


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


使用pip安装Icecream库。


pip install icecream


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


from icecream import ic 

def plus_five(num):
    return num + 5

ic(plus_five(4))
ic(plus_five(5))


输出结果如下。


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


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



02. 检查执行情况


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


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行的代码未执行。



03. 自定义前缀


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


from datetime import datetime
from icecream import ic 
import time
from datetime import datetime

def 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'


可以看到代码的执行时间,就显示在输出的前面。



04. 获取更多的信息


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


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


from icecream import ic 

def plus_five(num):
    return num + 5

ic.configureOutput(includeContext=True)
ic(plus_five(4))
ic(plus_five(5))


输出结果如下。


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


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


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

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


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

  • prefix,自定义输出前缀

  • outputFunction,更改输出函数

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

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



05. 删除Icecream代码

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

from icecream import ic

def plus_five(num):
    return num + 5

ic.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 - plus_five(4): 9
ic| ice_1.py:8 in - 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代码就整洁了。



总结


到此,你就应该就学会了如何使用icecream去打印调试。


更多功能可以访问「GitHub」,了解详情~


https://github.com/gruns/icecream


见面礼


码加我微信备注「三剑客」送你上图三本Python入门电子书 


推荐阅读


  1. 好气!进大厂被学历卡住了...

  2. 熬夜一周整理我的数据分析学习资源

  3. 为什么建议大家使用 Linux 开发?爽(外加七个感叹号)

  4. 我为什么抛弃Windows,入坑MacBook

  5. 自学Python3年,我终于做了这个决定....

点分享
点收藏
点点赞
点在看



浏览 22
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报