全網最適合入門的物件導向程式設計教程:29 異常捕獲-斷言與防禦性程式設計和help函式的使用

FreakStudio發表於2024-07-31

全網最適合入門的物件導向程式設計教程:29 類和物件的 Python 實現-斷言與防禦性程式設計和 help 函式的使用

image

摘要:

在 Python 中,斷言是一種常用的除錯工具,它允許程式設計師編寫一條檢查某個條件。本文主要介紹了斷言的應用場景和特點以及 assert 語句的使用,同時介紹了防禦性程式設計和 help()函式。

原文連結:

FreakStudio的部落格

往期推薦:

學嵌入式的你,還不會物件導向??!

全網最適合入門的物件導向程式設計教程:00 物件導向設計方法導論

全網最適合入門的物件導向程式設計教程:01 物件導向程式設計的基本概念

全網最適合入門的物件導向程式設計教程:02 類和物件的 Python 實現-使用 Python 建立類

全網最適合入門的物件導向程式設計教程:03 類和物件的 Python 實現-為自定義類新增屬性

全網最適合入門的物件導向程式設計教程:04 類和物件的Python實現-為自定義類新增方法

全網最適合入門的物件導向程式設計教程:05 類和物件的Python實現-PyCharm程式碼標籤

全網最適合入門的物件導向程式設計教程:06 類和物件的Python實現-自定義類的資料封裝

全網最適合入門的物件導向程式設計教程:07 類和物件的Python實現-型別註解

全網最適合入門的物件導向程式設計教程:08 類和物件的Python實現-@property裝飾器

全網最適合入門的物件導向程式設計教程:09 類和物件的Python實現-類之間的關係

全網最適合入門的物件導向程式設計教程:10 類和物件的Python實現-類的繼承和里氏替換原則

全網最適合入門的物件導向程式設計教程:11 類和物件的Python實現-子類呼叫父類方法

全網最適合入門的物件導向程式設計教程:12 類和物件的Python實現-Python使用logging模組輸出程式執行日誌

全網最適合入門的物件導向程式設計教程:13 類和物件的Python實現-視覺化閱讀程式碼神器Sourcetrail的安裝使用

全網最適合入門的物件導向程式設計教程:全網最適合入門的物件導向程式設計教程:14 類和物件的Python實現-類的靜態方法和類方法

全網最適合入門的物件導向程式設計教程:15 類和物件的 Python 實現-__slots__魔法方法

全網最適合入門的物件導向程式設計教程:16 類和物件的Python實現-多型、方法重寫與開閉原則

全網最適合入門的物件導向程式設計教程:17 類和物件的Python實現-鴨子型別與“file-like object“

全網最適合入門的物件導向程式設計教程:18 類和物件的Python實現-多重繼承與PyQtGraph串列埠資料繪製曲線圖

全網最適合入門的物件導向程式設計教程:19 類和物件的 Python 實現-使用 PyCharm 自動生成檔案註釋和函式註釋

全網最適合入門的物件導向程式設計教程:20 類和物件的Python實現-組合關係的實現與CSV檔案儲存

全網最適合入門的物件導向程式設計教程:21 類和物件的Python實現-多檔案的組織:模組module和包package

全網最適合入門的物件導向程式設計教程:22 類和物件的Python實現-異常和語法錯誤

全網最適合入門的物件導向程式設計教程:23 類和物件的Python實現-丟擲異常

全網最適合入門的物件導向程式設計教程:24 類和物件的Python實現-異常的捕獲與處理

全網最適合入門的物件導向程式設計教程:25 類和物件的Python實現-Python判斷輸入資料型別

全網最適合入門的物件導向程式設計教程:26 類和物件的Python實現-上下文管理器和with語句

全網最適合入門的物件導向程式設計教程:27 類和物件的Python實現-Python中異常層級與自定義異常類的實現

全網最適合入門的物件導向程式設計教程:28 類和物件的Python實現-Python程式設計原則、哲學和規範大彙總

更多精彩內容可看:

給你的 Python 加加速:一文速通 Python 平行計算

一文搞懂 CM3 微控制器除錯原理

肝了半個月,嵌入式技術棧大彙總出爐

電子計算機類比賽的“武林秘籍”

一個MicroPython的開源專案集錦:awesome-micropython,包含各個方面的Micropython工具庫

文件和程式碼獲取:

可訪問如下連結進行對文件下載:

https://github.com/leezisheng/Doc

image

本文件主要介紹如何使用 Python 進行物件導向程式設計,需要讀者對 Python 語法和微控制器開發具有基本瞭解。相比其他講解 Python 物件導向程式設計的部落格或書籍而言,本文件更加詳細、側重於嵌入式上位機應用,以上位機和下位機的常見串列埠資料收發、資料處理、動態圖繪製等為應用例項,同時使用 Sourcetrail 程式碼軟體對程式碼進行視覺化閱讀便於讀者理解。

相關示例程式碼獲取連結如下:https://github.com/leezisheng/Python-OOP-Demo

正文

斷言(assert)

在 Python 程式設計中,斷言(assert)作為一種強大的除錯工具,被廣泛應用於程式碼的除錯和開發過程中。透過在程式碼中插入斷言語句,我們可以對程式碼的正確性進行嚴格的檢查。當斷言的條件為假時,程式會引發 AssertionError 異常並停止執行。而當斷言的條件為真時,程式會如常繼續執行,彷彿斷言語句從未存在過。因此,合理使用斷言,對於確保程式碼的質量和穩定性具有重要意義。

assert  表示式 , 描述

以下面程式碼為例,可以看到“1==2”的結果為 False,丟擲了 AssertionError。

image

與異常不同,斷言是為了提醒開發人員,在程式中可能出現了無法恢復的錯誤。對於一些可以預見的錯誤,例如未找到相關檔案,使用者通常能夠自行糾正或重試。然而,斷言並非為這類問題而生。在無 bug 的程式中,斷言條件將永遠保持沉默。但如果違背了斷言,程式就會崩潰並報告錯誤,向開發人員明確指出究竟是哪個“不可能”的情況出現了。這使得追蹤和修復程式中的 bug 變得更為輕鬆。在 Python 中,斷言語句是一種用於除錯的輔助功能,它並非處理執行時錯誤的機制。使用斷言的目的在於幫助開發人員更快地找到可能導致 bug 的根本原因。除非程式中確實存在 bug,否則斷言絕不會丟擲錯誤。

防禦性程式設計與 unittest 單元測試庫

斷言一般用在防禦型的程式設計、執行時檢查程式邏輯、檢查約定、程式常量、檢查文件時,在從來不會執行失敗的程式碼不必要加上斷言。在單元測試框架中,我們常常使用斷言。所謂單元測試,就是指對軟體中的最小可測試單元進行檢查和驗證,通常是一個函式或一個方法。單元測試有助於我們在早期發現錯誤,提高程式碼的可靠性和可維護性。在 Python 中,內建了 unittest 單元測試庫,可以用來編寫測試程式碼。unittest 中常用的幾個常用斷言的使用方法如下:

名稱 作用
assertEqual 如兩個值相等,則 pass
assertNotEqual 如兩個值不相等,則 pass
assertTrue 判斷 bool 值為 True,則 pass
assertFalse 判斷 bool 值為 False,則 Pass
assertIsNone 不存在,則 pass
assertIsNotNone 存在,則 pass

關於 unittest 單元測試庫中斷言的使用我們將會在之後講到,這裡僅作簡單瞭解即可。

在使用斷言時,需要特別注意的點是在命令列中使用-o 和-oo 標誌,或者修改 CPython 中的 PYTHONOPTIMIZE 環境變數,可以全域性性地禁用斷言。此時,所有的斷言語句都將失效,程式將直接跳過而不處理斷言,因此不會執行任何條件表示式。

在 Python 的實際開發過程中,我們經常會遇到效能問題。所謂效能問題,就是 Python 程式執行得相對較慢。遇到效能問題時,我們有兩種方法可以進行最佳化:一是修改原始碼,最佳化邏輯,提升效能;二是開啟 Python 直譯器的最佳化功能。

Python 直譯器提供了兩種最佳化級別:

  • level1 最佳化:透過將內建的__debug__全域性變數設定為 false,並刪除 assert 語句,達到最佳化效果。
  • level2 最佳化:除了 level1 的最佳化措施外,還會刪除函式的文件說明(即函式後面的''''註釋)。

使用-O 引數可以達到 level1 最佳化效果(大寫字母 O),而使用-OO 引數則可以達到 level2 最佳化效果(兩個都是大寫字母 O)。這些最佳化方法對於提升 Python 程式的執行速度非常有幫助。

python -o main.py

help()函式

在 Python 中,有許多內建函式和模組,其中一些可能不太起眼,但卻非常實用。其中之一就是 help()函式。help()函式用於獲取有關 Python 物件、模組、函式或方法的幫助資訊。它可以更好地理解 Python 的功能和如何正確使用它們。

help()函式的基本用法非常簡單,只需在互動式 Python 直譯器中輸入物件、模組、函式或方法的名稱,並將其作為引數傳遞給 help()函式。

help語法:help([object])

這裡,我們看看 assert 函式的 help 輸出:

image

image

相關文章