Python中名稱空間包簡介

banq發表於2024-05-10

Python 名稱空間包是一種將多個獨立包組合成單個可匯入名稱空間的方法。它們允許您擁有兩個或多個可以在同一父名稱空間下匯入的單獨包。

Python 名稱空間包是一種高階 Python 特性。您可能聽說過它們與 __init__.py 檔案的關係。具體來說,如果您的包中沒有包含至少一個空的 __init__.py 檔案,那麼您的包就會變成一個名稱空間包。

在大多數情況下,名稱空間包和普通包在專案中的使用行為並無不同。事實上,你可能不小心忘記在至少一個軟體包中包含 __init__.py 檔案,但卻沒有注意到任何副作用。雖然名稱空間包的匯入速度通常比普通包慢一些,但通常不會遇到太多問題。

Python 名稱空間包可能會對管理或架構相關包集合的人有用。


名稱空間軟體包是什麼樣的?
假設你在ABC公司工作:

  • 你的團隊希望確保其庫中的所有軟體包都能透過 abc_corp 名稱空間訪問。
  • 無論你使用什麼軟體包,只要它是由ABC公司製作的,你就可以從 abc_corp 匯入。

如果沒有名稱空間軟體包,你將有兩種選擇:

  1. 建立一個 monorepo,即一個名為 abc_corp 的單一軟體包,其中包含數百個模組,可用於您可能需要的所有不同庫和實用程式。
  2. 建立各種軟體包,但都以 abc_corp 作為字首。例如,你可以把 abc_corp _dateutil 作為一個軟體包。

建立 monorepo 的麻煩在於,每個人都必須下載所有程式碼,即使他們只使用其中的一小部分。這也使版本管理和其他打包工作流程變得複雜,尤其是在不同團隊負責不同子包的情況下。

名稱空間包允許您擁有多個具有自己的打包工作流程的單獨包,但它們都可以位於同一abc_corp 名稱空間中。
現在將製作三個包:

  1. abc_corp-dateutil:一些特定於 ABC  Corporation 的日期實用程式
  2. abc_corp-magic-numbers:ABC Corporation 特有的一些數字生成實用程式
  3. abc-service:想要同時使用abc-corp-dateutil和abc-corp-magic-numbers包的員工專案

設定名稱空間軟體包
要開始設定 ABC 公司的名稱空間軟體包,請建立以下資料夾和檔案結構:

abc-corp/

├── abc-corp-dateutil/
│   ├── abc_corp/
│   │   └── dateutil.py
│   └── pyproject.toml

├── abc-corp-magic-numbers/
│   ├── abc_corp/
│   │   └── magic.py
│   └── pyproject.toml

└── abc-service/
    └── abc_service.py

這樣,你就擁有了三個軟體包的基本檔案結構。兩個實用程式包(snake-corp-dateutil 和 snake-corp-magic-numbers)都首先定義了一個名為 abc_corp 的隱式名稱空間包。之所以是隱式名稱空間包,是因為沒有 __init__.py 檔案。

至於匯入名稱,

  • 匯入 abc-corp-dateutil 包為abc_corp.dateutil,
  • 匯入 abc-corp-magic-numbers 為 abc_corp.magic。

你將使用一個虛擬環境來容納你的專案。在虛擬環境中,你將安裝這兩個實用程式包,這就是為什麼你要為每個程式包都安裝一個 pyproject.toml 檔案的原因。這就模擬了在公司軟體包伺服器上安裝這兩個軟體包的情況。


為什麼需要名稱空間包?
Python 名稱空間包在兩種情況下可能有用:

  1. 您有一個非常大的軟體包,但並非該軟體包的所有使用者都需要訪問它提供的所有內容。儘管如此,您還是想保留公共名稱空間
  2. 您有許多不同且相關的包,並且您希望它們都共享相同的名稱空間。

名稱空間包可以提供更多用途,而不僅僅是將大量包分組在單個名稱空間下。一個名稱空間將它們全部包含進來,並在原始碼中繫結它們!

潛在用例
當您想要將相關但獨立的包合併到單個名稱空間下以便於匯入和組織時,名稱空間包會很有用。

  • Python 標準庫本身對某些元件使用名稱空間包。
  • 它們還允許透過新增新的子包來擴充套件現有的名稱空間,而無需修改原始包程式碼

儘管名稱空間軟體包並不常見--可能是因為大多數品牌名稱空間軟體包都是閉源的--但它們確實存在。下面是幾個使用名稱空間包的公共專案例項:

  • OpenTelemetry
  • discord.py
  • Azure
  • Google

 

相關文章