優雅地載入Yaml配置檔案

語言: CN / TW / HK

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 程式設計學習圈,每日干貨分享