当前位置: 首页 > 科技观察

答应我,停止使用Print调试Python!

时间:2023-03-18 13:12:47 科技观察

相信大部分学习Python的人肯定会使用内置函数print()来调试代码。那么在一个大项目中,如果你也使用print调试你的Python代码,你会发现你的终端有多个输出。然后你要区分哪一行代码是每一行输出的结果。例如,运行以下程序。num1=30num2=40print(num1)print(num2)输出结果。3040这些输出中的哪一个是num1?num2又是哪一个?找到两个输出可能不是很困难,但如果有超过五个不同的输出怎么办?试图找到与输出相关联的代码可能非常耗时。当然你可以在打印语句中加入文字,使其更容易理解:num1=30num2=40print("num1"num1)print("num2"num1)输出结果。num130num240的结果很容易理解,但是写相关信息需要时间。这时候,就到了“Icecream”的上场时间啦~01.Icecream是什么?Icecream是Python的第三方库,可以用最少的代码让打印和调试更清晰。使用pip安装Icecream库。在pipinstallicecream旁边,让我们通过打印Python函数的输出来尝试一下。fromicecreamiimporticdefplus_five(num):returnnum+5ic(plus_five(4))ic(plus_five(5))输出结果如下。ic|plus_five(4):9ic|plus_five(5):10通过使用icecream,我们不仅可以看到函数输出,还可以看到函数及其参数!02.查看执行如果想找出代码执行到哪里,可以通过执行以下操作找到执行了哪条语句。defhello(user:bool):ifuser:print("I'muser")else:print("I'mnotuser")hello(user=True)输出结果。I'muser通过使用icecream可以在没有冗余文本信息的情况下轻松完成上述操作。fromicecreamimporticdefhello(user:bool):ifuser:ic()else:ic()hello(user=True)输出结果如下。ic|ice_1.py:5inhello()at02:34:41.391从输出结果来看,函数hello中第5行的代码已经执行,但是第7行的代码还没有执行。03.自定义前缀如果想在打印语句中插入自定义前缀(比如代码执行时间),icecream也可以实现。fromdatetimeimportdatetimefromicecreamiimporticimporttimefromdatetimeimportdatetimedeftime_format():returnf'{datetime.now()}|>'ic.configureOutput(prefix=time_format)for_inrange(3):time.sleep(1)ic('Hello')输出结果如下。2021-01-2410:38:23.509304|>'Hello'2021-01-2410:38:24.545628|>'Hello'2021-01-2410:38:25.550777|>'Hello'可以看到执行时间代码,就在输出之前。04.获取更多信息除了了解与输出相关的代码外,您可能还想了解代码执行行和代码文件。在ic.configureOutput()中,将includeecontext的参数值设置为True。fromicecreamiimporticdefplus_five(num):returnnum+5ic.configureOutput(includeContext=True)ic(plus_five(4))ic(plus_five(5))输出结果如下。ic|ice_test.py:7in-plus_five(4):9ic|ice_test.py:8in-plus_five(5):10我们知道,第一个输出是由文件icecream_example中的函数plus_five生成??的在.py的第7行执行。第二个输出由代码文件第8行的函数plus_five执行。以上两个操作都使用了ic.configureOutput()函数。通过查看源码,我们可以看到有四个参数可以设置。prefix,自定义输出前缀outputFunction,改变输出函数argToStringFunction,自定义参数序列化字符串includeContext,显示文件名,代码行,函数信息05.删除Icecream代码最后,icecream可以只用于调试,print用于其他用途(如作为漂亮的印刷)。fromicecreamimporticdefplus_five(num):returnnum+5ic.configureOutput(includeContext=True)ic(plus_five(4))ic(plus_five(5))foriinrange(10):print(f'******Trainingmodel{i}******')输出结果。ic|ice_1.py:7in<模块>-plus_five(4):9ic|ice_1.py:8in<模块>-plus_five(5):10******Trainingmodel0**************训练模型1************训练模型2************训练模型3************训练模型4************Trainingmodel5************Trainingmodel6************Trainingmodel7************Trainingmodel8************Trainingmodel9******由于您可以区分调试打印和漂亮打印,因此很容易搜索和删除所有ic调试语句。删除所有调试代码后,您的Python代码就整洁了。综上所述,你应该已经学会了如何使用icecream进行打印和调试。