One Line of Code to Say Goodbye to Confusing Python Error Messages

该图片由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_colorcode_color syntax_error_color 和 PrettyError 可以自定义它们。

另外,您可能会注意到,我使用了 PrettyError 提供的枚举作为默认颜色。有 9 种不同的主要颜色,包括 BLACKGREY 、 、 RED GREENYELLOW BLUE MAGENTACYANWHITE 。每种颜色还带有前缀 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_beforelines_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 错误消息中存在的一些限制,以确保错误消息更易于理解,从而提高开发和调试效率。

有许多有用的功能,例如颜色编码、时间戳包含、变量值显示和可自定义的堆栈跟踪。当然,作为一个调试工具,我们可能需要考虑是否希望它在所有环境中都能工作。因此,可以引入环境变量来解决问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/268560.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浅谈XSS简单漏洞xss-labs-master(初级)

一、环境以及xss漏洞简介 网上很多gethub自己下就行 XSS简介: 当用户访问被XSS注入的网页,XSS代码就会被提取出来。用户浏览器就会解析这段XSS代码,也就是说用户被攻击了。 用户最简单的动作就是使用浏览器上网,并且浏览器中有J…

案例介绍:汽车售后服务网络构建与信息抽取技术应用(开源)

一、引言 在当今竞争激烈的汽车行业中,售后服务的质量已成为品牌成功的关键因素之一。作为一位经验丰富的项目经理,我曾参与构建一个全面的汽车售后服务网络,旨在为客户提供无缝的维修、保养和配件更换服务。这个项目的核心目标是通过高效的…

自动化测试介绍、selenium用法(自动化测试框架+爬虫可用)

文章目录 一、自动化测试1、什么是自动化测试?2、手工测试 vs 自动化测试3、自动化测试常见误区4、自动化测试的优劣5、自动化测试分层6、什么项目适合自动化测试 二、Selenuim1、小例子2、用法3、页面操作获取输入内容模拟点击清空文本元素拖拽frame切换窗口切换/标…

统信UOS及麒麟KYLINOS操作系统上如何切换键盘布局

原文链接:如何切换键盘布局 | 统信UOS | 麒麟KYLINOS Hello,大家好啊,最近有朋友在群里提到他的键盘输入“Y”会显示“Z”,输入“Z”会显示“Y”。这个问题听起来可能有些奇怪,但其实并不罕见。出现这种情况的原因&…

SpringMVC总结

SpringMVC SpringMVC是隶属于Spring框架的一部分,主要是用来进行Web开发,是对Servlet进行了封装。 对于SpringMVC我们主要学习如下内容: SpringMVC简介 请求与响应 REST风格 SSM整合(注解版) 拦截器 SpringMVC是处理Web层/表现层的框架&#xff…

langchain学习笔记(九)

RunnableBranch: Dynamically route logic based on input | 🦜️🔗 Langchain 基于输入的动态路由逻辑,通过上一步的输出选择下一步操作,允许创建非确定性链。路由保证路由间的结构和连贯。 有以下两种方法执行路由 1、通过Ru…

AI算法项目优化流程

算法优化的调试流程可以根据具体情况有所不同,但通常包括以下关键步骤,希望对大家有所帮助。通过以下流程,可以有效地识别和解决算法优化过程中的问题,提升算法性能和稳定性。北京木奇移动技术有限公司,专业的软件外包…

制作耳机壳的UV树脂和塑料材质相比优势有哪些?

制作耳机壳的UV树脂相比塑料材质有以下优势: 高强度与耐磨性:UV树脂具有高强度和耐磨性,能够更好地保护耳机内部零件,延长耳机使用寿命。相比之下,塑料材质可能较易磨损或刮伤。耐高温:UV树脂具有较好的耐…

排序——归并排序

归并排序和快排一样, 都是一种利用二叉树分治思想实现的排序。同时归并排序也和快排一样有递归归并排序和非递归归并排序两种。 本节主要复习归并排序, 并且两种实现方式都会复习到。 递归归并 要实现递归归并排序的代码。 我们首先需要理解递归归并排序…

PyTorch-神经网络

神经网络,这也是深度学习的基石,所谓的深度学习,也可以理解为很深层的神经网络。说起这里,有一个小段子,神经网络曾经被打入了冷宫,因为SVM派的崛起,SVM不了解的同学可以去google一下&#xff0…

stm32触发硬件错误位置定位

1.背景 1. 项目中,调试过程或者测试中都会出现程序跑飞问题,这个时候问题特别难查找。 2. 触发硬件错误往往是因为内存错误。这种问题特别难查找,尤其是产品到了测试阶段,而这个异常复现又比较难的情况下,简直头疼。…

(css)element-ui表格行图片点击放大且可调整preview-src-list大图预览样式

(css)element-ui表格行图片点击放大且可调整preview-src-list大图预览样式 效果&#xff1a; 常规写法&#xff1a; <el-table-column prop"display" label"展示效果" align"center"><template slot-scope"scope"><e…

IEEE Transactions on Industrial Electronics工业电子TIE修改稿注意事项及提交须知

一、背景 兔年末投了一篇TIE&#xff0c;手稿初次提交的注意事项也整理成了博客IEEE Transactions on Industrial Electronics工业电子TIE论文投稿须知&#xff0c;获得了许多点赞和收藏。最近也收到了审稿结果&#xff0c;给的意见是大修major revision&#xff0c;总之只要不…

国内chatgpt写作软件,chatgpt国内使用

随着人工智能技术的不断发展&#xff0c;国内涌现出了一些基于ChatGPT模型的写作软件&#xff0c;这些软件不仅能够实现智能化的文章写作&#xff0c;还支持批量生成各种类型的文章。本文将深入探讨国内ChatGPT写作软件&#xff0c;以及它们在批量文章创作方面的应用与优势。 C…

C#使用iText7给PDF文档添加书签

上一篇文章将SqlSugar官网文档中每个链接对应的网页生成独立PDF文档再合并为单个PDF文档&#xff0c;但是没有书签&#xff0c;八百多页的内容查找和跳转都不方便&#xff0c;本文学习和使用iText7给PDF文档添加多级书签。   添加多级书签分为两大步骤&#xff1a;1&#xff…

选项 打光 试题总结

试题1 被测物体100100mm&#xff0c;精度要求被测物体 &#xff0c;精度要求0.1mm&#xff0c;相机距被测物体在200&#xff5e;320mm之间&#xff0c;要求选择合适的相机和镜头&#xff1f; 分析如下&#xff1a; 通常我们用的相机靶面是4:3 的所以我们要用短边来计算视场&am…

【element-ui】el-select multiple多选,表单校验问题解决方法

在项目开发过程中发现&#xff0c;el-select设置了multiple支持多选属性之后&#xff0c;el-select赋值之后&#xff0c;表单校验不通过 解决思路及解决方法&#xff1a; 1、首先看看v-model 、prop属性、rules校验是否正确&#xff0c;这里注意el-select的rules校验的trigger…

具身智能计算系统,机器人时代的 Android | 新程序员

【导读】具身智能作为一种新兴的研究视角和方法论&#xff0c;正在刷新我们对智能本质及其发展的理解&#xff1a;传统的 AI 模型往往将智能视为一种独立于实体存在的抽象能力&#xff0c;而具身智能则主张智能是实体与其环境持续互动的结果。 本文深度剖析了具身智能计算系统…

第二篇【传奇开心果系列】Python的自动化办公库技术点案例示例:深度解读Pandas金融数据分析

传奇开心果博文系列 系列博文目录Python的自动化办公库技术点案例示例系列 博文目录前言一、Pandas 在金融数据分析中的常见用途和功能介绍二、金融数据清洗和准备示例代码三、金融数据索引和选择示例代码四、金融数据时间序列分析示例代码五、金融数据可视化示例代码六、金融数…

Linux设备模型(十) - bus/device/device_driver/class

四&#xff0c;驱动的注册 1&#xff0c;struct device_driver结构体 /** * struct device_driver - The basic device driver structure * name: Name of the device driver. * bus: The bus which the device of this driver belongs to. * owner: The module own…