Python模塊、包和異常處理

? ? ? ? 大家好,在當今軟件開發領域,Python作為一種簡潔、易讀且功能強大的編程語言,被廣泛應用于各種領域。作為一名測試開發工程師,熟練掌握Python的模塊、包和異常處理是提高代碼可維護性和錯誤處理能力的關鍵。本文將和大家一起探討Python中的模塊、包和異常處理的重要性以及如何正確使用它們來構建高質量的測試代碼。

一、模塊

????????在Python中,模塊是一種組織和封裝代碼的方式。一個模塊是一個包含 Python 定義和語句的文件,可以包含變量、函數、類和可執行的代碼。模塊提供了一種將相關的代碼組織在一起的機制,使得代碼的復用和維護變得更加容易。

????????模塊是 Python 中組織和封裝代碼的一種方式。通過?import?關鍵字可以引入模塊,并在當前模塊中使用模塊中的函數、類和變量。可以使用別名和重命名來簡化模塊的使用。還可以自己編寫模塊,并在其他程序中進行引入和使用。理解和熟悉模塊的使用可以提高代碼的復用性和可維護性。

1、引入模塊

????????在 Python 中,使用?import?關鍵字來引入一個模塊。通過?import,可以將一個模塊中的代碼引入到當前模塊中進行使用。引入模塊后,就可以使用模塊中定義的函數、類和變量。

import mathprint(math.sqrt(16))  # 輸出: 4.0

????????這個例子中,import math?引入了 Python 標準庫中的?math?模塊。然后可以使用?math.sqrt()?函數計算平方根。

2、別名和重命名

????????為了方便使用,可以給模塊指定別名或重命名。使用?as?關鍵字可以為模塊指定別名,在代碼中使用別名代替模塊名。

import math as mprint(m.sqrt(16))  # 輸出: 4.0

????????這個例子中,import math as m?將?math?模塊重命名為?m。然后可以使用?m.sqrt()?計算平方根。

3、導入模塊的部分內容

????????有時候只需要導入模塊的一部分內容,而不是整個模塊。可以使用?from ... import ...?語句來導入模塊中的特定函數、類或變量。

from math import sqrtprint(sqrt(16))  # 輸出: 4.0

????????這個例子中,from math import sqrt?導入了?math?模塊中的?sqrt?函數。直接可以使用?sqrt()?計算平方根,而無需使用模塊名前綴。

4、自定義模塊

????????在 Python 中,可以自己編寫模塊,并在其他程序中進行引入和使用。創建一個模塊,只需要將相關的代碼保存在一個以?.py?為擴展名的文件中。

# mymodule.py
def greeting(name):print("Hello, " + name)

在其他程序中引入自定義的模塊:

import mymodulemymodule.greeting("John")  # 輸出: Hello, John

自定義的模塊可以包含函數、類和變量等,可以在其他程序中進行引入和使用。

5、模塊搜索路徑

????????Python 解釋器會按照一定的順序搜索模塊的位置。當導入一個模塊時,解釋器會按照以下順序搜索模塊的位置:

  • 內置模塊
  • 在?sys.path?列表中的目錄
  • 當前目錄

????????這意味著可以將自己編寫的模塊放置在特定的目錄中,然后將該目錄添加到?sys.path?列表中,從而使解釋器能夠找到并導入這些模塊。

二、包

????????在Python中,包是一種用于組織和管理模塊的機制。包是一個包含了一個特殊文件?__init__.py?的目錄,它可以包含多個模塊和子包。使用包可以更好地組織和管理大型項目的代碼,并提供了一種層次化的結構。

????????包是 Python 中組織和管理模塊的一種機制。包是一個包含?__init__.py?文件的目錄,它可以包含多個模塊和子包。使用包可以更好地組織和管理代碼,提供了一種層次化的結構。可以使用?import?關鍵字引入包或包中的模塊,并使用別名或重命名來簡化包的使用。還可以通過?from ... import ...?語句導入包中的特定模塊或成員。理解和熟悉包的使用可以提高代碼的組織性和可維護性,特別對于大型項目來說。

1、創建包

????????創建一個包非常簡單,只需創建一個目錄,并在該目錄中添加一個名為?__init__.py?的文件。這個特殊的文件標識了該目錄是一個包。

mypackage/__init__.pymodule1.pymodule2.pysubpackage/__init__.pymodule3.py

????????在上面的示例中,mypackage?是一個包的目錄,其中包含了?__init__.py?文件和其他模塊文件。subpackage?是一個子包,它也是一個包的目錄,并包含了自己的?__init__.py?文件和模塊文件。

2、引入包

????????使用?import?關鍵字可以引入一個包或包中的模塊。引入包后,可以使用包中模塊的函數、類和變量。

import mypackage.module1mypackage.module1.some_function()

????????在上面的示例中,import mypackage.module1?引入了?mypackage?包中的?module1?模塊。然后可以使用?mypackage.module1?來訪問該模塊中的函數和變量。

3、別名和重命名

????????類似于模塊,也可以為包指定別名或重命名。使用?as?關鍵字可以為包指定別名,以便在代碼中使用別名代替包名。

import mypackage.module1 as m1m1.some_function()

????????在上面的示例中,import mypackage.module1 as m1?將?mypackage.module1?重命名為?m1,然后可以使用?m1?來訪問該模塊中的函數和變量。

4、導入包的部分內容

????????類似于模塊,也可以只導入包中的特定模塊或成員。使用?from ... import ...?語句可以導入包中的特定模塊或成員。

from mypackage.module1 import some_functionsome_function()

????????在上面的示例中,from mypackage.module1 import some_function?導入了?mypackage?包中的?module1?模塊中的?some_function?函數。直接可以使用?some_function()?調用該函數,而無需使用包名前綴。

5、包的層次結構

????????包可以形成層次結構,即包中可以包含子包。子包是一個包的子目錄,它也必須包含一個?__init__.py?文件。通過創建多層次的包結構,可以更好地組織和管理代碼。

mypackage/__init__.pymodule1.pymodule2.pysubpackage1/__init__.pymodule3.pysubpackage2/__init__.pymodule4.py

????????在上面的示例中,mypackage?包中包含了兩個子包?subpackage1?和?subpackage2,以及其他模塊文件。

6、相對導入

????????相對導入是一種在包內部進行模塊引用的方式。相對導入使用?from .?或?from ..?的形式來指定相對于當前模塊的位置進行導入。

# mypackage/subpackage1/module3.py
from . import module4
from .. import module1

????????在上面的示例中,module3.py?是?subpackage1?包中的一個模塊。通過?from . import module4?導入了同級目錄下的?module4?模塊,而?from .. import module1?則是導入了上級目錄下的?module1?模塊。

7、__init__.py?文件的作用

?????__init__.py?文件是包中的一個特殊文件,它可以為空文件,也可以包含有效的Python代碼。該文件在包被導入時會被執行,并可以用于初始化包的狀態或執行其他必要的操作。此外,__init__.py?文件還可以定義包的公共接口,指定哪些模塊或成員應該在包級別上可見。

8、第三方包和Python包管理器

????????除了Python內置的包和模塊外,還有許多由其他開發者編寫的第三方包可供使用。這些包可以提供各種功能和工具,從而擴展Python的能力。常用的Python包管理器包括pip和conda,它們可以用于安裝、管理和升級第三方包。

例如,可以使用以下命令使用pip安裝名為requests的包:

pip install requests

安裝完成后,就可以在代碼中引入該包并使用它的功能了。

三、異常處理

????????在Python中,異常處理是一種機制,用于捕獲和處理程序運行時可能發生的錯誤或異常情況。通過合理地處理異常,可以使程序在遇到錯誤時能夠繼續執行或提供友好的錯誤信息,增強程序的健壯性和可靠性。

1、異常的種類

????????Python中有許多內置的異常類型,例如TypeErrorValueErrorFileNotFoundError等。每種異常類型都代表了不同的錯誤或異常情況。此外,還可以自定義異常類來表示特定的錯誤。

一些常見的異常種類如下:

  • Exception(異常):

    Exception是所有內置異常的基類,其他異常類型都是Exception的子類。通常情況下,應捕獲特定的異常類型,而不是捕獲基類Exception

  • AttributeError(屬性錯誤):

    當嘗試訪問對象不存在的屬性或方法時引發的異常。

  • ValueError(值錯誤):

    當傳遞給函數的參數具有正確的類型但無效的值時引發的異常。

  • TypeError(類型錯誤):

    當操作或函數應用于不兼容類型的對象時引發的異常。

  • IndexError(索引錯誤):

    當嘗試訪問序列(列表、元組等)中不存在的索引位置時引發的異常。

  • KeyError(鍵錯誤):

    當嘗試使用字典中不存在的鍵訪問字典元素時引發的異常。

  • FileNotFoundError(文件未找到錯誤):

    當嘗試打開不存在的文件時引發的異常。

  • IOError(輸入/輸出錯誤):

    當發生與輸入/輸出操作相關的錯誤時引發的異常,例如讀取或寫入文件時發生錯誤。

  • ZeroDivisionError(零除錯誤):

    當嘗試將一個數除以零時引發的異常。

  • ImportError(導入錯誤):

    當導入模塊時發生錯誤時引發的異常,可能是模塊不存在或無法導入。

  • KeyboardInterrupt(鍵盤中斷):

    當用戶按下Ctrl+C或中斷程序執行時引發的異常。

  • AssertionError(斷言錯誤):

    當使用assert語句時,斷言條件為False時引發的異常。

  • StopIteration(停止迭代):

    當迭代器沒有更多的項目時引發的異常。

  • UnicodeError(Unicode錯誤):

    當處理Unicode字符串時遇到錯誤時引發的異常。

2、try-except語句

????????使用try-except語句可以捕獲并處理異常。try塊中包含可能引發異常的代碼,而except塊用于處理捕獲到的異常。

try:# 可能引發異常的代碼
except SomeException:# 處理某種特定異常的代碼
except AnotherException:# 處理另一種特定異常的代碼
except:# 處理其他所有異常的代碼

????????在上面的示例中,try塊中的代碼可能引發異常。如果某個異常被捕獲到,就會執行相應的except塊中的代碼。可以有多個except塊來處理不同的異常類型。還可以使用一個通用的except塊來處理所有未被特定except塊捕獲的異常。

3、捕獲異常對象

except塊中,可以通過將異常對象賦值給一個變量來獲取有關異常的詳細信息。

try:# 可能引發異常的代碼
except SomeException as e:# 處理異常,使用異常對象e獲取相關信息

????????在上面的示例中,將捕獲到的異常對象賦值給變量e,可以使用e來訪問異常的屬性和方法,以獲取有關異常的更多信息。

4、處理多個異常

可以在一個except塊中處理多個異常類型。

try:# 可能引發異常的代碼
except (Exception1, Exception2):# 處理Exception1和Exception2異常的代碼

????????在上面的示例中,當Exception1Exception2異常被捕獲時,都會執行相應的except塊中的代碼。

5、finally塊

????????可以使用finally塊來定義一段無論是否發生異常都會執行的代碼。無論是否發生異常,finally塊中的代碼都會被執行。

try:# 可能引發異常的代碼
except SomeException:# 處理異常的代碼
finally:# 無論是否發生異常,都會執行的代碼

在上面的示例中,無論是否發生異常,finally塊中的代碼都會被執行。

6、拋出異常

可以使用raise語句來拋出自定義的異常或重新拋出已捕獲的異常。

try:# 可能引發異常的代碼if some_condition:raise CustomException("Something went wrong.")
except CustomException:# 處理自定義異常raise  # 重新拋出已捕獲的異常

????????在上面的示例中,當滿足某個條件時,會拋出一個自定義的異常。然后可以在except塊中處理該自定義異常,或者使用raise重新拋出已捕獲的異常。

7、異常的層級關系

????????異常類型之間可以形成層級關系,這種層級關系是通過繼承實現的。在Python中,異常類形成一個類似樹狀結構的層級關系,其中基類異常捕獲更通用的錯誤,子類異常捕獲更具體的錯誤。這允許我們在處理異常時靈活地捕獲和處理不同級別的異常。

下面是一個示例異常層級關系的簡化圖示:

????????在這個層級關系中,BaseException是所有異常的基類,Exception是大多數常見異常的基類。BaseExceptionException之間有其他一些通用的異常類,如SystemExitKeyboardInterrupt

????????Exception類下面是StandardError,它是大多數內置異常的基類。StandardError的子類包括ArithmeticError(算術錯誤)和LookupError(查找錯誤)。ArithmeticError的子類包括ZeroDivisionError(除零錯誤)和OverflowError(溢出錯誤)。LookupError的子類包括IndexError(索引錯誤)和KeyError(鍵錯誤)。此外,還有其他一些異常類,如EnvironmentError(環境錯誤),它是OSError(操作系統錯誤)的基類。EnvironmentError的子類包括IOError(輸入/輸出錯誤)和FileNotFoundError(文件未找到錯誤)。

????????通過了解異常的層級關系,我們可以根據需要選擇適當的異常類型進行捕獲和處理。捕獲父類異常可以同時捕獲其子類異常,這樣可以提供更靈活和全面的異常處理機制,以滿足不同的錯誤情況。

8、else語句

可以在try-except語句中添加else塊,用于處理在try塊中沒有發生異常時執行的代碼。

try:# 可能引發異常的代碼
except SomeException:# 處理異常的代碼
else:# 在沒有發生異常時執行的代碼

在上面的示例中,如果在try塊中沒有發生異常,那么else塊中的代碼將被執行。

9、自定義異常類

????????可以通過繼承內置的Exception類或其子類來創建自定義的異常類,以表示特定的錯誤或異常情況。

class CustomException(Exception):passtry:if some_condition:raise CustomException("Something went wrong.")
except CustomException as e:# 處理自定義異常

????????在上面的示例中,CustomException是一個自定義的異常類,它繼承自Exception類。當某個條件滿足時,會拋出該自定義異常。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/14486.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/14486.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/14486.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SAP-MRP和采購申請

1、如果采購申請是手工創建的,跑MRP會不會被覆蓋? 創建一個采購申請18089476,然后運行MRP-MD03,再用MD04查看下 從上圖看,手工創建的采購申請被打上*號,沒有被覆蓋掉。 2、如果采購申請被審批了,會不會被覆蓋掉? 首先創建一個獨立需求MD61 然后庫存消耗掉為0,運行M…

shell實現ssh服務防止暴力破解 —— 筑夢之路

實現原理 對系統登陸日志文件/var/log/secure,進行數據篩選,查找登陸失敗的ip地址,然后將ip加入到黑名單中。 腳本內容 #!/bin/bash# 獲取登陸失敗的ip地址failedcat /var/log/secure|grep "Failed"|awk {print $11}|sort|uniq …

普源精電收購耐數電子——用“鈔能力”拿下“量子”?

「量子市界」聚焦量子前沿,揭秘市場動態┃2024年4月30日,普源精電新增“量子科技”概念。 似乎一夜之間,新增“量子科技”概念的上市企業如雨后春筍般登場——普源精電就是其一。普源精電本就持有耐數電子32.26%股權,于4月2日發布…

c4d云渲染是工程文件會暴露嗎?

在數字創意產業飛速發展的今天,C4D云渲染因其高效便捷而備受歡迎。然而,隨著技術應用的深入,人們開始關注一個核心問題:在享受云渲染帶來的便利的同時,C4D工程文件安全嗎?是否會有暴露的風險?下…

【如何讓論文中摘要后面的內容不出現在目錄中】

首先選擇摘要二字,設置為一級標題,然后選擇摘要后面的內容設置為正文樣式,再選擇這一部分看一下是不是都是正文大綱級別,如果是那就可以了。 具體流程如下 1、選擇摘要二字,設置為一級標題樣式 2、選擇摘要后面的文…

x264 碼率控制原理:rate_estimate_qscale 函數

rate_estimate_qscale 函數 原理 函數功能:根據目前使用的實際比特數更新一幀的qscale;是一個復雜的決策過程,需要考慮多種因素,如幀類型、編碼的復雜度、目標比特率、緩沖區大小等,以確保視頻質量和文件大小之間的平衡。函數參數分析:x264_t *h :編碼器上下文信息結構…

擴散模型學習1

DDPM 總體訓練原理 https://www.bilibili.com/video/BV1nB4y1h7CN/?spm_id_from333.337.search-card.all.click&vd_sourcef745c116402814185ab0e8636c993d8f 講得很好:每次都是輸入t和noise-x的圖像,預測noise之后得到和加入的noise比較&#xff1b…

LLM實戰:當網頁爬蟲集成gpt3.5

1. 背景 最近本qiang~關注了一個開源項目Scrapegraph-ai,是關于網頁爬蟲結合LLM的項目,所以想一探究竟,畢竟當下及未來,LLM終將替代以往的方方面面。 這篇文章主要介紹下該項目,并基于此項目實現一個demo頁面&#x…

Java并發: 鎖和同步

在Java并發: 面臨的挑戰那一篇中我們提到鎖和同步是實現并發安全(可見性/原子性)的方法之一。這一章我們來講講Java中的鎖和同步的各種工具,包括: LockSupportAbstractQueuedSynchronizerJava內置的鎖實現 1. LockSupport LockSupport是基于Unsafe的park/unpark實…

智能禁區監控:計算機視覺在人員禁區闖入檢測中的應用

基于視覺分析的人員禁區闖入行為檢測算法主要依賴于計算機視覺技術和深度學習算法。這些技術結合高性能的攝像頭和圖像處理硬件,實現了對監控區域內人員行為的自動識別和分析。具體來說,這種檢測算法利用攝像頭捕捉的視頻數據,通過深度學習模…

Kubernetes 應用滾動更新

Kubernetes 應用版本號 在 Kubernetes 里,版本更新使用的不是 API 對象,而是兩個命令:kubectl apply 和 kubectl rollout,當然它們也要搭配部署應用所需要的 Deployment、DaemonSet 等 YAML 文件。 在 Kubernetes 里應用都是以 …

nssctf——web

[SWPUCTF 2021 新生賽]gift_F12 1.打開環境后,這里說要900多天會有flag,這是不可能的 2.f12查看源碼,然后在html中查找flag (在最上方的欄目中,或者按ctrlf) [SWPUCTF 2021 新生賽]jicao 1.打開環境是一段…

Fragment問題:java.lang.IllegalStateException

錯誤提示: Process: com.example.accountapp, PID: 3987 java.lang.IllegalStateException: Could not execute method for android:onClick …

Vue速成學習筆記

這兩天速成了一下Vue,在這里記錄一下相關的筆記,之后有時間詳細學Vue的時候再來回顧一下! 一、Vue理解 1、Vue的核心特征:雙向綁定。 在網頁中,存在視圖和數據。在Vue之前,需要使用JavaScript編寫復雜的邏…

web前端面試題

web前端面試題 1、前端如何實現優化性能 (1)減少網絡時間 ①使用DNS緩存技術 ? ②減少需要傳輸的文件尺寸 ? ③加快文件傳輸速度 (2)減少發送的請求數量 ①利用瀏覽器緩存 ? ②使用合并的圖片文件 (3)提高瀏覽器下載的并發度 ①JS文件放在HTML文檔最后 ? ②使用多個域名 (…

音視頻及H264/H256編碼相關原理

一、音視頻封裝格式原理: 我們播放的視頻文件一般都是用一種封裝格式封裝起來的,封裝格式的作用是什么呢?一般視頻文件里不光有視頻,還有音頻,封裝格式的作用就是把視頻和音頻打包起來。 所以我們先要解封裝格式&#…

谷歌上架,個人號比企業號好上?“14+20”封測如何解決,你知道了嗎

在Google Play上架應用,對開發者而言,既是挑戰也是機遇。隨著谷歌政策的不斷更新,特別是要求2023年11月13日后注冊的個人開發者賬號在發布正式版應用前,必須經過20人連續14天的封閉測試。 這一政策的改變使得許多開發者開始考慮使…

什么是物聯網通信網關?-天拓四方

在信息化、智能化的時代,物聯網技術的廣泛應用正在逐漸改變我們的生活方式。物聯網通過各種傳感器和設備,將現實世界與數字世界緊密相連,從而實現智能化、自動化的生活和工作方式。作為物聯網生態系統中的重要組成部分,物聯網通信…

【數據結構】堆(Heep)

???專欄:數據結構 🧑?🎓個人主頁:SWsunlight 目錄 一、堆: 定義: 性質: 大、小根堆: 二、實現堆(完全二叉樹): 前言: …

四、Filter

Filter簡介 Filter 的基本功能是對Servlet容器調用Servlet的過程進行攔截,從而在Servlet進行響應處理的前后實現一些特殊的功能.在Servlet API 中定義了三個接口類來供開發人員編寫Filter 程序:Filter,FilterChain,FilterConfigFilter 程序是一個實現了…