zoukankan      html  css  js  c++  java
  • 每天一个好用的 Python 库:pretty-errors 让你的 Bug 看起来与众不同

    首发于个人公.众.号:Python编程时光,转载请私信

    当我们写的一个脚本或程序发生各种不可预知的异常时,如果我们没有进行捕获处理的时候,通常都会致使程序崩溃退出,并且会在终端打印出一堆 密密麻麻 的 traceback 堆栈信息来告诉我们,是哪个地方出了问题。

    就像这样子,天呐,密集恐惧症要犯了都

    上面这段 traceback

    • 只有黑白两个颜色,无法像代码高亮那样,对肉眼实现太不友好了
    • 无法直接显示报错的代码,排查问题慢人一步,效率太低

    那有没有一种办法,可以解决这些问题呢?

    当然有了,在 Python 中,没有什么问题是一个库解决不了的,如果有,那就等你去开发这个库。

    今天要介绍的这个库呢,叫做 pretty-errors ,从名字上就可以知道它的用途,是用来美化错误信息的。

    通过这条命令你可以安装它

    $ python3 -m pip install pretty-errors
    

    1. 环境要求

    由于使用了 pretty-errors 后,你的 traceback 信息输出,会有代码高亮那样的效果,因此当你在使用测试使用 pretty-error 时,请确保你使用的终端可以输出带有颜色的字体。

    在 windows 上你可以使用 Powershell,cmder 等

    在 Mac 上你可以使用自带的终端,或者安装一个更好用的 iTerm2

    2. 效果对比


    随便写一个没有使用 pretty-errors ,并且报错了的程序,是这样子的。

    而使用了 pretty_errors 后,报错信息被美化成这样了。

    是不是感觉清楚了不少,那种密密麻麻带来的焦虑感是不是都消失了呢?

    当然这段代码少,你可能还没感受到,那就来看下 该项目在 Github上的一张效果对比图吧

    3. 配置全局可用

    可以看到使用了 pretty_errors 后,无非就是把过滤掉了一些干扰我们视线的无用信息,然后把有用的关键信息给我们高亮显示。

    既然既然这样,那 pretty_errors 应该也能支持我们如何自定义我们选用什么样的颜色,怎么排版吧?

    答案是显而易见的。

    pretty_errors 和其他库不太一样,在一定程度上(如果你使用全局配置的话),它并不是开箱即用的,你在使用它之前可能需要做一下配置。

    使用这一条命令,会让你进行配置,可以让你在该环境中运行其他脚本时的 traceback 输出都自动美化。

    $ python3 -m pretty_errors
    

    配置完成后,你再运行任何脚本,traceback 都会自动美化了。

    不仅是在我的 iTerm 终端下

    在 PyCharm 中也会

    唯一的缺点就是,原先在 PyCharm 中的 traceback 可以直接点击 文件路径 直接跳转到对应错误文件代码行,而你如果是在 VSCode 可以使用 下面自定义配置的方案解决这个问题(下面会讲到,参数是:display_link)。

    因此,有些情况下,你并不想设置 pretty_errors 全局可用。

    那怎么取消之前的配置呢?

    只需要再次输出 python -m pretty_errors,输出入 C 即可清除。

    4. 单文件中使用

    取消全局可用后,你可以根据自己需要,在你需要使用 pretty-errors 的脚本文件中导入pretty_errors,即可使用

    import pretty_errors
    

    就像这样

    import pretty_errors
    
    def foo():
        1/0
    
    if __name__ == "__main__":
        foo()
    

    值得一提的是,使用这种方式,若是你的脚本中,出现语法错误,则输出的异常信息还是按照之前的方式展示,并不会被美化。

    因此,为了让美化更彻底,官方推荐你使用 python -m pretty_errors

    5. 自定义设置

    上面的例子里,我们使用的都是 pretty_errors 的默认美化格式,展示的信息并没有那么全。

    比如

    • 它并没有展示报错文件的绝对路径,这将使我们很难定位到是哪个文件里的代码出现错误。
    • 如果能把具体报错的代码,给我们展示在终端屏幕上,就不需要我们再到源码文件中排查原因了。

    如果使用了 pretty_errors 导致异常信息有丢失,那还不如不使用 pretty_errors 呢。

    不过,可以告诉你的是,pretty_errors 并没有你想象的那么简单。

    它足够开放,支持自定义配置,可以由你选择你需要展示哪些信息,怎么展示?

    这里举一个例子

    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 进行配置时,抛出的的异常信息就变成这样了。

    当然了,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,表示每行的输出将与控制台尺寸相匹配,如果你设置的长度将好与控制台宽度匹配,则可能需要禁用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_COMPACTpretty_errors.FILENAME_EXTENDED,或者pretty_errors.FILENAME_FULL

    以上,就是我对 pretty_errors 的使用体验,总的来说,这个库功能非常强大,使用效果也特别酷炫,它就跟 PEP8 规范一样,没有它是可以,但是有了它会更好一样。对于某些想自定义错误输出场景的人,pretty_errors 会是一个不错的解决方案,明哥把它推荐给你。

  • 相关阅读:
    HDU 1501 Zipper(DFS)
    HDU 2181 哈密顿绕行世界问题(DFS)
    HDU 1254 推箱子(BFS)
    HDU 1045 Fire Net (DFS)
    HDU 2212 DFS
    HDU 1241Oil Deposits (DFS)
    HDU 1312 Red and Black (DFS)
    HDU 1010 Tempter of the Bone(DFS+奇偶剪枝)
    HDU 1022 Train Problem I(栈)
    HDU 1008 u Calculate e
  • 原文地址:https://www.cnblogs.com/wongbingming/p/12450565.html
Copyright © 2011-2022 走看看