该图片由15548337在Pixabay上发布
告别令人困惑的 Python 错误消息
灵活的错误消息增强库 — PrettyError
编程是一项活动,我们可能会用 20% 的时间将想法写成代码,然后用 80% 的时间清除错误并修复错误。错误消息绝对是我们每天都会看到的。但是,您是否遇到过 Python 错误消息的任何困难?
例如,错误消息可能非常冗长,这还不错,但是很难区分不同的部分并快速找到我们需要的信息。堆栈跟踪有时也过于压倒性和复杂而难以理解。自定义错误消息也不容易,除非我们重写 Exception 类,否则可能会再次让人不知所措。
在本文中,我将介绍一个名为 PrettyError 的库,它可以帮助我们解决上面提到的所有痛点以及更多痛点。它有许多很酷的功能,可以简化我们的调试过程,并帮助我们在编码作业中节省大量时间。
1. 安装和快速入门
该图片由Pexels在Pixabay上发布
像往常一样,安装 Pretty Error 库非常容易。我们只是简单地从 PyPI 获取 pip
它。
pip install pretty_errors
快速入门
这可能是最快的快速入门指南。当我们想使用具有默认配置的库时,我们需要做的就是在编码之前导入它。
import pretty_errors
现在,让我们定义一个没有 try-except 的函数,以便稍后我们可以手动创建一些错误。
def divide(a, b):return a / b
然后,让我们先看看没有 Pretty Errors 的样子。我们将模拟除以零误差。
divide(1, 0)
这是 Python 中的原始错误消息。然后,让我们通过简单地导入它并再次运行代码来启用 Pretty Error。
import pretty_errorsdivide(1, 0)
它已经进行了颜色编码,并带有简化的指示器,例如 stdin
和 函数名称 divide
。
由于这篇博文的局限性,演示颜色代码在实践中的用处是不切实际的。GitHub README 中有一张截图,如下所示。
图片提供:https://raw.githubusercontent.com/onelivesleft/PrettyErrors/master/example.png
在上面的场景中,你喜欢左边的那个(原始的)还是右边的那个(Pretty Error)?😃
2. 主要特点
该图片由Robert Owen-Wahl在Pixabay上发布
当然,该库可以做的比我们在快速入门中展示的更多。在本节中,我将介绍一些关键功能进行演示。
2.1 颜色代码的配置
颜色代码确实使错误消息更具可读性,并不令人惊讶,PrettyError 允许我们自定义颜色代码。
例如,让我们将以下代码放入 Python 脚本文件中 app.py
。
import pretty_errorsopen("non_existent_file.txt")
然后,让我们运行这个脚本,看看会发生什么。
$ python app.py
好的,上面是 PrettyError 中的默认颜色代码。如果我们想自定义代码怎么办?这很简单,只需使用 pretty_error
模块中的 configure()
功能,如下所示。
import pretty_errorspretty_errors.configure(line_color = pretty_errors.BRIGHT_RED,exception_color = pretty_errors.BRIGHT_MAGENTA,exception_arg_color = pretty_errors.CYAN,exception_file_color = pretty_errors.RED_BACKGROUND + pretty_errors.BRIGHT_WHITE
)open("non_existent_file.txt")
让我们再次运行此脚本文件。
有 16 种不同的错误消息输出类型,例如 function_color
, code_color
syntax_error_color
和 PrettyError 可以自定义它们。
另外,您可能会注意到,我使用了 PrettyError 提供的枚举作为默认颜色。有 9 种不同的主要颜色,包括 BLACK
、 GREY
、 、 RED
GREEN
、 YELLOW
BLUE
MAGENTA
、 CYAN
和 WHITE
。每种颜色还带有前缀 BRIGHT_
和后缀 _BACKGROUND
,因此有一系列不同的默认颜色供我们使用。
除此之外,您可能会注意到我在上面的配置代码中使用了组合颜色。
pretty_errors.RED_BACKGROUND + pretty_errors.BRIGHT_WHITE
这也是允许的,因此背景和字体颜色可以一起用于特定的消息类型。可以看出,如果我们想自定义错误消息,PrettyError 提供了足够的颜色代码选项。
2.2 添加时间戳
原始 Python 错误消息的缺点之一是它不会显示时间戳和错误。当然,常见的解决方案是将 Logging 模块添加到程序中。
但是,如果程序崩溃并出现完全未捕获和未知的异常,则日志记录解决方案通常也不会发生。此外,有时我们可能出于某种原因只想使用一些轻量级解决方案。
当然,PrettyError 可以通过简单地添加以下配置来做到这一点。
import pretty_errorspretty_errors.configure(display_timestamp=1
)open("non_existent_file.txt")
配置 display_timestamp
将显示时间戳和错误,如下所示。
但是等等,时间戳 perf_counter
不是人类可读的。别担心,还有另一种配置可以帮助我们自定义时间戳功能。下面是一个使用 datetime
模块获取当前时间戳的示例。由于配置将函数作为参数,因此最简单的方法是传递 lambda 函数。
import pretty_errors
import datetimepretty_errors.configure(display_timestamp=1,timestamp_function=lambda: datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
)open("non_existent_file.txt")
当然,如果你想要一个非常自定义的时间格式,最好在配置之前定义函数,然后只传递函数名称。
2.3 在错误中显示更多代码
原始 Python 错误消息的另一个限制是它仅显示带有错误的代码行。
有时,这可能还不够,因为发生错误的代码之前的其他代码可能是错误的关键因素。除此之外,在它之后显示代码也可能很有用,这样我们就知道如果错误没有发生,将执行什么。
是的,这在 PrettyError 中使用配置 lines_before
和 lines_after
是可行的。
import pretty_errorspretty_errors.configure(lines_before=2,lines_after=1
)# The output shouldn't show this comment (lines before)
# The output should show this comment (lines before)
def calculate(x):return 1 / x
# The output should show this comment (lines after)
# The output shouldn't show this comment (lines after)def wrapper():calculate(0)wrapper()
请关注上述代码片段中的注释。根据配置前后的行,我放置了一些注释来显示错误消息中应显示的哪一行代码。
另外,看到跟踪堆栈了吗?我们也可以控制跟踪堆栈的级别。这个功能有时非常有用,当我们不关心 main
方法的堆栈是什么时。因此,我们可以简化错误消息,以帮助我们专注于错误发生的确切位置。
这可以通过配置项 stack_depth
来实现。
import pretty_errorspretty_errors.configure(stack_depth=1
)def calculate(x):return 1 / xdef wrapper():calculate(0)wrapper()
因此,现在的堆栈深度更少了。
2.4 显示变量值
我敢打赌,这是 Python 中最需要的错误消息之一,但在原始错误消息中却缺失。当我们在开发过程中处理大多数错误时,我们必须使用调试工具来尝试重现该问题,这是很常见的。
如果错误消息可以告诉您变量的值是多少,该怎么办?也许在大多数情况下,我们可以立即解决问题!
在 PrettyError 中启用这个功能也很简单,我们可以将配置项 display_locals
设置为 1。
import pretty_errorspretty_errors.configure(display_locals=1 # Enable the display of local variables
)def calculate_divide(x, y):return x / ycalculate_divide(1, 0)
让我们运行这个脚本并看一看。
错误消息告诉我们这是一个 ZeroDivisionError
.如果我们检查变量的 x
输出 和 y
,我们可以看到 的值 y
是 0。因此,启用此功能后,调试效率会更高。
3. 环境最佳实践
该图片由YeriLee在Pixabay上发布
在实践中,我们有时可能希望错误消息非常冗长,但并非总是如此。就上面介绍的功能而言,启用或禁用它们的首选项在不同的环境中也可能有所不同。
因此,建议我们应该利用环境变量来控制 PrettyError 的行为。下面是一个示例。
import pretty_errors
import os# Configure PrettyErrors based on the environment
if os.getenv('ENV') == 'development':pretty_errors.configure(stack_depth=0, # Show full stackdisplay_locals=1 # Show local variables in development)
else:pretty_errors.configure(stack_depth=1, # Show only 3 levels depthdisplay_locals=0 # Hide local variables in production)# Main Program
def calculate(x):return 1 / xdef wrapper():calculate(0)wrapper()
让我们使用不同的环境变量运行脚本。结果如下所示。
请注意,如果您使用的是 Windows 操作系统,则应使用 set ENV=development
。
当然,您可以使用此方法为不同的环境进行任何其他自定义和配置。
总结
该图片由Hans在Pixabay上发布
在本文中,我介绍了 PrettyError。它旨在修复 Python 错误消息中存在的一些限制,以确保错误消息更易于理解,从而提高开发和调试效率。
有许多有用的功能,例如颜色编码、时间戳包含、变量值显示和可自定义的堆栈跟踪。当然,作为一个调试工具,我们可能需要考虑是否希望它在所有环境中都能工作。因此,可以引入环境变量来解决问题。