7.2 代码 BUG 变得酷炫的利器 =========================== .. image:: http://image.iswbm.com/20200804124133.png 当我们写的一个脚本或程序发生各种不可预知的异常时,如果我们没有进行捕获处理的时候,通常都会致使程序崩溃退出,并且会在终端打印出一堆 **密密麻麻** 的 traceback 堆栈信息来告诉我们,是哪个地方出了问题。 就像这样子,天呐,密集恐惧症要犯了都 .. image:: http://image.iswbm.com/image-20200307210853246.png 上面这段 traceback - 只有黑白两个颜色,无法像代码高亮那样,对肉眼实在太不友好了 - 无法直接显示报错的代码,排查问题慢人一步,效率太低 那有没有一种办法,可以解决这些问题呢? 当然有了,在 Python 中,没有什么问题是一个库解决不了的,如果有,那就等你去开发这个库。 今天要介绍的这个库呢,叫做 ``pretty-errors`` ,从名字上就可以知道它的用途,是用来美化错误信息的。 通过这条命令你可以安装它 .. code:: shell $ python3 -m pip install pretty-errors 1. 环境要求 ----------- 由于使用了 ``pretty-errors`` 后,你的 traceback 信息输出,会有代码高亮那样的效果,因此当你在测试使用 ``pretty-error`` 时,请确保你使用的终端可以输出带有颜色的字体。 在 windows 上你可以使用 Powershell,cmder 等 在 Mac 上你可以使用自带的终端,或者安装一个更好用的 iTerm2 2. 效果对比 ----------- -------------- 随便写一个没有使用 pretty-errors ,并且报错了的程序,是这样子的。 .. image:: http://image.iswbm.com/image-20200307212823345.png 而使用了 pretty_errors 后,报错信息被美化成这样了。 .. image:: http://image.iswbm.com/image-20200307213534278.png 是不是感觉清楚了不少,那种密密麻麻带来的焦虑感是不是都消失了呢? 当然这段代码少,你可能还没感受到,那就来看下 该项目在 Github上的一张效果对比图吧 .. image:: https://warehouse-camo.cmh1.psfhosted.org/31399c5a034c3989b9e99b35249e8f2f0d40e102/68747470733a2f2f692e696d6775722e636f6d2f306a7045716f622e706e67 3. 配置全局可用 --------------- 可以看到使用了 pretty_errors 后,无非就是过滤掉了一些干扰我们视线的无用信息,然后把有用的关键信息给我们高亮显示。 既然这样,那 pretty_errors 应该也能支持我们如何自定义想选用什么样的颜色,怎么排版吧? 答案是显而易见的。 pretty_errors 和其他库不太一样,在一定程度上(如果你使用全局配置的话),它并不是开箱即用的,你在使用它之前可能需要做一下配置。 使用这一条命令,会让你进行配置,可以让你在该环境中运行其他脚本时的 traceback 输出都自动美化。 .. code:: shell $ python3 -m pretty_errors .. image:: http://image.iswbm.com/image-20200307214742135.png 配置完成后,你再运行任何脚本,traceback 都会自动美化了。 不仅是在我的 iTerm 终端下 .. image:: http://image.iswbm.com/image-20200307213534278.png 在 PyCharm 中也会 .. image:: http://image.iswbm.com/image-20200307215530270.png 唯一的缺点就是,原先在 PyCharm 中的 traceback 可以直接点击 ``文件路径`` 直接跳转到对应错误文件代码行,而你如果是在 VSCode 可以使用 下面自定义配置的方案解决这个问题(下面会讲到,参数是:\ ``display_link``\ )。 .. image:: http://image.iswbm.com/image-20200307215834623.png 因此,有些情况下,你并不想设置 ``pretty_errors`` 全局可用。 那怎么取消之前的配置呢? 只需要再次输入 ``python -m pretty_errors``\ ,选择 ``C`` 即可清除。 .. image:: http://image.iswbm.com/image-20200307214600749.png 4. 单文件中使用 --------------- 取消全局可用后,你可以根据自己需要,在你需要使用 ``pretty-errors`` 的脚本文件中导入\ ``pretty_errors``\ ,即可使用 .. code:: python import pretty_errors 就像这样 .. code:: python import pretty_errors def foo(): 1/0 if __name__ == "__main__": foo() 值得一提的是,使用这种方式,若是你的脚本中,出现语法错误,则输出的异常信息还是按照之前的方式展示,并不会被美化。 因此,为了让美化更彻底,官方推荐你使用 ``python -m pretty_errors`` 5. 自定义设置 ------------- 上面的例子里,我们使用的都是 ``pretty_errors`` 的默认美化格式,展示的信息并没有那么全。 比如 - 它并没有展示报错文件的绝对路径,这将使我们很难定位到是哪个文件里的代码出现错误。 - 如果能把具体报错的代码,给我们展示在终端屏幕上,就不需要我们再到源码文件中排查原因了。 如果使用了 ``pretty_errors`` 导致异常信息有丢失,那还不如不使用 ``pretty_errors`` 呢。 不过,可以告诉你的是,\ ``pretty_errors`` 并没有你想象的那么简单。 它足够开放,支持自定义配置,可以由你选择你需要展示哪些信息,怎么展示? 这里举一个例子 .. code:: python import pretty_errors # 【重点】进行配置 pretty_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 = pretty_errors.RED + '> ' + pretty_errors.default_config.line_color, code_color = ' ' + pretty_errors.default_config.line_color, ) # 原来的代码 def foo(): 1/0 if __name__ == "__main__": foo() 在你像上面这样使用 ``pretty_errrs.configure`` 进行配置时,抛出的异常信息就变成这样了。 .. image:: http://image.iswbm.com/image-20200308121949011.png 当然了,\ ``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`` 用于设置背景色,举个例子如下。 .. image:: http://image.iswbm.com/image-20200308125431779.png 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,表示每行的输出将与控制台尺寸相匹配,如果你设置的长度刚好与控制台宽度匹配,则可能需要禁用\ ``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``\ ,或者\ ``pretty_errors.FILENAME_FULL`` 以上,就是我对 ``pretty_errors`` 的使用体验,总的来说,这个库功能非常强大,使用效果也特别酷炫,它就跟 PEP8 规范一样,没有它是可以,但是有了它会更好一样。对于某些想自定义错误输出场景的人,\ ``pretty_errors`` 会是一个不错的解决方案,明哥把它推荐给你。