一、背景介紹
在實際生產專案中,不同環境(如開發、測試、生產環境)常有不同配置需求,如資料庫連結等。我們期望一份程式碼無需改動,僅透過單一配置變數調整就能適配和使用多個環境,實現 “一份程式碼,多處部署”的需求,以提升系統部署靈活性及配置管理能力。具體而言,支援“多環境配置”的配置管理框架(類庫)應支援以下功能:
(1)必須支援不同環境載入不同配置,且多個環境可載入通用配置。
(2)必須支援複雜資料結構,如:列表、字典、物件等。
(3)必須支援欄位資料型別轉換,如:直接輸出布林型別欄位的值 True,而不是字串 'True'。
(4)必須支援變數引用,如:DOMAIN = "example.org",ADMIN_EMAIL = "admin@{DOMAIN}"。
(5)最好支援執行時動態修改配置,可透過修改系統環境變數更新變數值。
(6)最好支援主流配置檔案格式,如 yml、json、toml 等,尤其是 Python 中常見的 toml 格式。
二、技術選型
Python 技術棧中常見的配置管理框架(類庫)有 ConfigParser、pydantic、dynaconf、dotenv 和 configobj。其中僅 ConfigParser 為 Python 標準庫內建模組。以下對各類庫功能、優缺點進行對比,進而輸出最終選型。
1. 功能對比
功能/庫 | dynaconf | pydantic | dotenv | configobj | ConfigParser |
---|---|---|---|---|---|
不同環境載入不同配置,且多個環境可載入通用配置 | 支援 | 部分支援 | 部分支援 | 部分支援 | 部分支援 |
支援複雜資料結構,如列表、字典、物件等 | 支援 | 支援 | 不支援 | 支援 | 不支援 |
支援欄位資料型別轉換 | 支援 | 支援 | 不支援 | 部分支援 | 部分支援 |
支援變數引用 | 支援 | 不支援 | 支援 | 支援 | 部分支援 |
執行時動態修改配置配置 | 支援 | 支援 | 支援 | 支援 | 支援 |
支援主流配置檔案格式,如 yml、json、toml 等 | 支援 | 支援 | 不支援 | 不支援 | 不支援 |
部分支援 指需要額外擴充套件或二次開發。
2. 優缺點總結
庫 | 優點 | 缺點 |
---|---|---|
dynaconf | 支援多種配置檔案格式(YAML、JSON、TOML 等);支援複雜資料結構;支援環境切換和通用配置;功能強大,靈活性高。 | 需要額外安裝;學習曲線相對較陡。 |
pydantic | 強大的資料驗證和型別轉換功能;支援複雜資料結構;與 FastAPI 等框架整合良好。 | 需要額外安裝;不直接支援多種配置檔案格式,但可以結合其他庫使用。 |
dotenv | 簡單易用,適合載入環境變數;與其他庫相容性好。 | 功能有限,僅支援 .env 檔案;不支援複雜資料結構和多種配置檔案格式。 |
configobj | 支援巢狀結構和基本的資料型別轉換;易於使用,適合處理 .ini 格式的配置檔案。 |
不支援多種配置檔案格式(僅支援 .ini );部分支援高階配置管理功能,如環境切換和通用配置。 |
ConfigParser | 內建於 Python 標準庫,無需額外安裝;簡單易用,適合處理基本的 .ini 配置檔案。 |
不支援複雜資料結構;不支援多種配置檔案格式;功能較為有限,不支援高階配置管理功能。 |
希望這個調整後的表格能夠更好地滿足你的需求。
三、最終選擇
經上述功能對比及優缺點總結,dotenv 和 ConfigParser 因不支援複雜資料結構被率先排除;configobj 既不支援多種配置檔案格式,又僅部分支援通用配置和資料轉換,也不合適;剩餘兩方案中,pydantic 極少用於配置管理,不支援變數引用,僅部分支援載入通用配置,實際使用時配置載入與解釋需二次開發,也不完全適合當配置管理工具。而 dynaconf 功能全面,又是專業配置管理庫,為最優選擇。