社区所有版块导航
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

调试Python代码,也可以不用print

Crossin的编程教室 • 2 周前 • 43 次点击  
相信大部分人学习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



Crossin的新书《码上行动:用ChatGPT学会Python编程》已经上市了。本书以ChatGPT为辅助,系统全面地讲解了如何掌握Python编程,适合Python零基础入门的读者学习。【点此查看详细介绍】
购买后可加入读者交流群,Crossin为你开启陪读模式,解答你在阅读本书时的一切疑问。
Crossin的其他书籍:


添加微信 crossin123 ,加入编程教室共同学习~

感谢转发点赞的各位~
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/173546
 
43 次点击