來自: 簡訊Alfred
大家有沒有覺 得編程更像是這樣一種行為,我們可能會用 20 % 的時間將想法寫入程式碼,然後用 80% 的時間來清除錯誤和修復漏洞。 錯誤資訊肯定是我們每天都會看到的, 資訊 可能非常 冗長, 這樣 很難區分不同的部份並快速找到我們需要的資訊 。 堆疊跟蹤有 時也過於復雜,難以理解。 此外,除非我們覆 蓋異常類,否則也很難自訂錯誤資訊,這可能又會 讓人不知所 措。
在本文中,我將介紹一個名為 PrettyError 的庫,它可以幫助我們解決上述所有痛點以及更多問題。它有許多很酷的功能,可以簡化我們的偵錯過程,幫助我們在編碼工作中節省大量時間。
1. 安裝和快速啟動
像往常一樣,安裝 PrettyError 庫非常簡單。我們只需執行 pip 從 PyPI 獲取即可。
pip install pretty_errors
快速入門
這可能是最快捷的快速入門指南。當我們想使用預設配置的程式庫時,只需在編碼前匯入即可。
import pretty_errors
現在,讓我們定義一個不帶 try-except 的函式,以便以後手動建立一些錯誤。
defdivide(a, b):
return a / b
那麽,讓我們先看看沒有 Pretty Errors 時的情況。我們將模擬除以零的錯誤。
divide(1, 0)
這就是 Python 中的原始錯誤資訊。然後,讓我們透過簡單的匯入來啟用 Pretty Error,並再次執行程式碼。
import pretty_errors
divide(1, 0)
它已用顏色編碼,並配有簡化的指示器,如 stdin 和函式名稱分隔符。
由於本文篇幅所限,無法演示顏色程式碼在實踐中的作用。下圖是 GitHub README 中的截圖。
在上述場景中,您喜歡左邊的(原始)還是右邊的(高亮錯誤)?
2. 主要特點
該庫能做的遠不止我們在快速入門中展示的這些。在本節中,我將挑選一些關鍵功能進行演示。
2.1 配置顏色程式碼
PrettyError 允許我們自訂顏色程式碼。
例如,讓我們在 Python 指令碼檔 app.py 中輸入以下程式碼。
import pretty_errors
open("non_existent_file.txt")
然後,讓我們執行這個指令碼看看會發生什麽。
以上就是 PrettyError 中的預設顏色程式碼。如果我們想自訂程式碼呢?很簡單,只需使用 pretty_error 模組中的 configure() 函式,如下所示。
import pretty_errors
pretty_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 種不同的主色調,包括黑色、灰色、紅色、綠色、黃色、藍色、金黃色、青色和白色。每種顏色還帶有字首 BRIGHT_ 和字尾 _BACKGROUND,因此我們可以使用一系列不同的預設顏色。
除此之外,你可能會註意到我在上述配置程式碼中使用了組合顏色。
pretty_errors.RED_BACKGROUND + pretty_errors.BRIGHT_WHITE
這也是允許的,因此背景色和字型色可以一起用於特定的資訊型別。由此可見,如果我們想自訂錯誤資訊,PrettyError 提供了足夠多的顏色程式碼選項。
2.2 添延長間戳
原始 Python 錯誤資訊的一個缺點是不能在顯示錯誤的同時顯示時間戳。當然,常見的解決方案是在程式中添加日誌模組。
但是,如果程式在完全未捕獲和未知異常的情況下崩潰,日誌記錄解決方案通常也無法實作。此外,有時我們可能出於某種原因想使用一些輕量級的解決方案。
當然,只需添加以下配置,PrettyError 就能做到這一點。
import pretty_errors
pretty_errors.configure(
display_timestamp=1
)
open("non_existent_file.txt")
配置 display_timestamp 將在顯示錯誤的同時顯示一個時間戳,如下所示。
時間戳是 perf_counter 並不完全適合人類閱讀。還有一種配置可以幫助我們自訂時間戳功能。下面是一個使用 datetime 模組獲取當前時間戳的範例。由於配置將函式作為參數,因此最簡單的方法就是傳遞一個 lambda 函式。
import pretty_errors
import datetime
pretty_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_errors
pretty_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)
defcalculate(x):
return1 / x
# The output should show this comment (lines after)
# The output shouldn't show this comment (lines after)
defwrapper():
calculate(0)
wrapper()
請關註上述程式碼片段中的註釋。根據配置前後的行數,我添加了一些註釋,以顯示錯誤資訊中應顯示哪一行程式碼。
我們還可以控制跟蹤堆疊的級別。有時,當我們不關心主方法之前的堆疊情況時,這個功能會非常有用。因此,我們可以簡化錯誤資訊,幫助我們關註錯誤發生的具體位置。
這可以透過配置項 stack_depth 來實作。
import pretty_errors
pretty_errors.configure(
stack_depth=1
)
defcalculate(x):
return1 / x
defwrapper():
calculate(0)
wrapper()
因此,現在的堆疊深度更小了。
2.4 顯示變量值
這是 Python 中最受歡迎的錯誤資訊之一,但在原來的錯誤資訊中卻不見蹤影。在開發過程中,當我們處理大多數 bug 時,經常需要使用偵錯工具來重現問題。
如果錯誤資訊能告訴你變量的值是多少呢?也許在大多數情況下,我們可以直接排除故障!
在 PrettyError 中啟用這一功能也非常簡單,我們可以將 display_locals 配置項設定為 1。
import pretty_errors
pretty_errors.configure(
display_locals=1# Enable the display of local variables
)
defcalculate_divide(x, y):
return x / y
calculate_divide(1, 0)
讓我們執行這個指令碼看一看。
錯誤資訊告訴我們這是一個 ZeroDivisionError。如果我們檢視變量 x 和 y 的輸出,就會發現 y 的值為 0。
3.環境方面的最佳做法
實際上,我們有時可能希望錯誤資訊非常冗長,但並非總是如此。就上文介紹的功能而言,在不同的環境中,啟用或禁用這些功能的偏好也會有所不同。
因此,我們建議利用環境變量來控制 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 stack
display_locals=1# Show local variables in development
)
else:
pretty_errors.configure(
stack_depth=1, # Show only 3 levels depth
display_locals=0# Hide local variables in production
)
# Main Program
defcalculate(x):
return1 / x
defwrapper():
calculate(0)
wrapper()
讓我們用不同的環境變量執行指令碼。 請註意,如果使用的是 Windows 作業系統,則應使用 set ENV=development。 當然,使用這種方法,您還可以針對不同的環境進行其他客製和配置。
在本文中,我介紹了 PrettyError。它旨在修正 Python 錯誤資訊中存在的一些限制,確保錯誤資訊更易於理解,從而提高開發和偵錯效率。 它有許多有用的功能,如彩色編碼、包含時間戳、顯示變量值和自訂堆疊跟蹤。 當然,作為一種偵錯工具,我們可能需要考慮是否希望它在所有環境下都能工作。 因此,可以引入環境變量來解決這個問題。
加入知識星球【我們談論數據科學】
600+小夥伴一起學習!