每天一个有用的Python库:pretty-errors让你的bug看起来不一样不可预测的异常,如果我们不捕获它们,通常会导致程序崩溃退出,终端会打印一堆密密麻麻的traceback堆栈信息告诉我们问题出在哪里。就这样,我的天,我要得密集恐惧症了。上面的回溯只是黑白的。不能像代码那样高亮显示。对肉眼太不友好了,不能直接显示报错的代码。故障排除慢了一步,效率太低,那么有没有办法解决这些问题呢?当然,在Python中,没有库不能解决的问题。如果有,那就等你开发这个库吧。今天要介绍的这个库叫做pretty-errors。从名字就可以知道它的用途,就是用来美化错误信息的。您可以通过此命令安装它$python3-mpipinstallpretty-errors1。环境要求使用pretty-errors后,你的traceback信息输出会有代码高亮的效果,所以当你在测试使用pretty-error的时候,一定要使用可以输出彩色字体的终端。在Windows上,你可以使用Powershell、cmder等。在Mac上,你可以使用内置终端,或者安装一个更好用的iTerm22。对比一下效果,就写一个不使用pretty-errors而报错的程序,像这样的。使用pretty_errors后,错误信息被美化成这样。是不是感觉清醒了很多,人多的地方带来的焦虑感也消失了?当然,这段代码比较小,大家可能还没有感觉到,所以我们先看一下该项目在Github上的效果对比图。干扰我们视线的无用信息,然后为我们突出有用的关键信息。既然这样,pretty_errors应该也支持我们怎么自定义选择什么颜色,怎么排版吧?答案很明显。pretty_errors与其他库不同,在一定程度上(如果你使用全局配置),它不是开箱即用的,你可能需要在使用前配置它。使用此命令将允许您对其进行配置,以便在您在此环境中运行其他脚本时自动美化回溯输出。$python3-mpretty_errors配置完成后,运行任意脚本,traceback会自动美化。不仅在我的iTerm终端中,而且在PyCharm中。唯一不足的是PyCharm中原来的traceback可以直接点击文件路径跳转到相应的错误文件代码行,而如果你在VSCode中,可以使用下面的自定义配置方案解决这个问题(如将下文提到,参数为:display_link)。因此,有些情况下您不想让pretty_errors全局可用。那么如何取消之前的配置呢?再次输出python-mpretty_errors即可,输出C清除即可。4.取消单文件全局可用后,可以根据自己的需要在需要使用pretty-errors的脚本文件中importpretty_errors,可以这样importpretty_errorsimportpretty_errorsdeffoo():1/0if__name__=="__main__":foo()值得一提的是,如果你使用这个方法,如果你的脚本有语法错误,输出的异常信息仍然会像之前一样显示,并且会不被美化。所以,为了美化的更彻底,官方推荐大家使用python-mpretty_errors5。自定义设置在上面的例子中,我们都使用了pretty_errors默认的美化格式,显示的信息并不是那么完整。比如,它不显示错误文件的绝对路径,这会让我们很难定位到代码中的错误在哪个文件中。如果能在终端屏幕上给我们显示具体的错误代码,我们就不需要再去源代码文件中查找原因了。如果使用pretty_errors导致异常信息丢失,最好不要使用pretty_errors。但是,我可以告诉你,pretty_errors并不像你想象的那么简单。足够开放,支持自定义配置,可以选择需要显示什么信息,如何显示?下面是一个例子importpretty_errors#[重点]configurepretty_errors.configure(separator_character='*',filename_display=pretty_errors.FILENAME_EXTENDED,line_number_first=True,display_link=True,lines_before=5,lines_after=2,line_color=rorspretty_'>'+pretty_errors.default_config.line_color,code_color=''+pretty_errors.default_config.line_color,)#原代码deffoo():1/0if__name__=="__main__":foo()当你像上面那样使用的时候pretty_errrs.configure配置好了,抛出的异常信息就变成这样了。当然pretty_errors.configure()也可以接收很多参数,你可以根据自己的需要进行配置。5.1设置颜色header_color:设置标题行的颜色。timestamp_color:设置时间戳颜色default_color:设置默认颜色filename_color:设置文件名颜色line_number_color:设置行号颜色。function_color:设置函数颜色。link_color:设置链接的颜色。在设置颜色时,pretty_errors提供了一些常用的颜色常量,可以直接调用。BLACK:黑色GREY:灰色RED:红色GREEN:绿色YELLOW:黄色BLUE:蓝色MAGENTA:洋红色CYAN:蓝色绿色WHITE:白色并且每种颜色都有对应的匹配BRIGHT_变体和_BACKGROUND变体,其中_BACKGROUND用于设置背景颜色,示例如下。5.2设置显示内容当line_number_first开启时,先显示行号而不是文件名。lines_before:显示发生异常的前几行代码lines_after:显示发生异常的后几行代码display_link:启用后,会在错误位置下方写一个链接,VScode会让你点击关联。separator_character:用于创建标题行的字符。默认使用连字符。如果设置为''或None,标题将被禁用。display_timestamp:启用时,将在回溯标头中写入时间戳。display_locals启用时,会显示栈顶帧代码中的局部变量及其值。当启用display_trace_locals时,出现在其他堆栈框架代码中的局部变量将与其值一起显示。5.3设置如何显示line_length:设置每行的长度,默认为0,表示每行的输出会匹配console的大小,如果设置长度匹配console的宽度,可能需要禁用full_line_newline以防止出现明显的双换行符。full_line_newline:输出字符满时是否插入换行符。timestamp_function调用此函数生成时间戳。默认值为time.perf_counter。当启用top_first时,堆栈跟踪会反转,首先显示堆栈的顶部。启用display_arrow时,语法错误将显示指向有问题的标记的箭头。当启用truncate_code时,每行代码都将被截断以适合行长度。stack_depth堆栈跟踪中要显示的最大条目数。当0时将显示整个堆栈,这是默认值。当启用exception_above时,异常将显示在堆栈跟踪上方。exception_below:启用后,异常显示在堆栈跟踪下方。启用reset_stdout时,重置转义序列将写入stdout和stderr;如果您的控制台颜色错误,请启用此选项。filename_display设置文件名的显示方式,共有三个选项:pretty_errors.FILENAME_COMPACT,pretty_errors.FILENAME_EXTENDED,orpretty_errors.FILENAME_FULL上面是我使用pretty_errors的经验,总的来说这个库很强大,效果也很酷炫,跟PEP8规范一样,没有它也好,有它就更好了。对于一些想自定义错误输出场景的人来说,pretty_errors会是一个很好的解决方案,明哥推荐给大家。
