優雅地載入Yaml配置檔案
Yaml是一個對人非常友好的配置格式。
有時候,我們在開發環境、測試環境和線上環境會有多套不同的配置檔案,如何在不修改程式碼的情況下方便的切換配置檔案呢?我以前的文章講過一種方法,使用環境變數來指定配置檔名。今天我們來介紹一個更先進的工具,專門用來高效載入配置檔案。這就是Facebook開源的Hydra。
這個工具有多簡單呢?我們先寫兩個配置檔案,然後看看怎麼讀取它:
使用pip安裝Hydra:
python3 -m pip install hydra-core
接下來,我們寫一段程式碼,來讀取配置檔案:
import os
import hydra
from omegaconf import DictConfig
env = os.getenv('DATA_CENTER', 'dev')
@hydra.main(config_path="config", config_name=env)
def main(cfg: DictConfig):
print('MongoDB連結地址是:', cfg.mongo.uri)
print('Redis的key是:', cfg.redis.key)
print('黑名單是:', cfg.detail.black_list)
if __name__ == '__main__':
main()
執行效果如下圖所示:
其中,裝飾器hydra.main的引數config_path指定存放配置檔案的資料夾,config_name用來指定配置檔案的名字(去掉.yaml)。
這樣一來,我們可以通過環境變數指定要使用哪個配置檔案。
這樣看起來似乎跟我以前講的方法沒什麼區別啊。那麼,高階的功能來了。例如現在我使用dev環境時,臨時想修改一下Redis的Key怎麼辦呢?以前的方法,我就必須去修改Yaml檔案,把Key改掉。但是,既然是臨時修改,測試完了又要改回來,顯然非常麻煩。
使用Hydra,這個問題就不再是問題了。我們來看看直接在命令中覆蓋資料的方法:
請看圖中,我程式碼沒有做任何修改,Yaml也沒有做任何修改。只需要在啟動命令的時候增加一個引數redis.key=new_key,那麼程式讀取到的就是新的值了。這對臨時測試的時候非常有用。
除了我上面介紹的這些,Hydra還可以實現自動補全,自動提示引數名,自動以多個不同的配置連續執行等等功能。大家可以在它的官方文件[1]中看到使用方法。
最後,我補充一個點。Hydra為什麼不能在呼叫函式的時候,傳遞額外的引數,例如下面這樣寫就會報錯:
這是因為,Hydra的裝飾物件應該是程式的入口函式。給入口函式傳遞引數是很奇怪的。如果你的入口函式要根據引數的不同值執行不同的邏輯,那麼這個引數你完全可以放到配置檔案中。而不是用函式引數來傳入。
所以,這裡報錯應該是功能而不是bug。本來就不應該在入口函式中新增額外的引數。
以上就是本次分享的所有內容,想要了解更多歡迎前往公眾號:Python 程式設計學習圈,每日干貨分享
- Python 海象運算子 (:=) 的三種用法
- 如何利用現有加密方案保護你的 Python 程式碼
- Python 為什麼要保留顯式的 self ?
- Python 浮點數的冷知識
- Python 記憶體分配時的小祕密
- 如何通過測試提升 Python 程式碼的健壯性
- 推薦5個超級實用的 Python 模組,不知道就out啦!
- Python 中幾種屬性訪問的區別
- Python 之父新發文,將替換現有解析器
- Python中tuple =賦值的四個問題
- 判斷檔案的幾種方法及其優劣對比
- 理清 WebSocket 和 HTTP 的關係
- 學習Python操作JSON,網路資料交換不用愁
- 學習Python列表,只需這篇文章就夠了
- 37個Python入門小程式
- 一文詳解Python裝飾器,真香!
- 你全會算我輸,讓人驚歎的Python程式碼
- Office 檔案轉 PDF 之服務實戰
- Python 教你如何給影象分類
- Python 世界的黑客帝國