8s yaml 配置生成_cfg4py:一个严肃的Python配置模块应有的风格-层级式、部署环境自适应、自动补全...
關于如何配置一個Python程序,如果你還停留在使用ini,json,yaml,xml等文件格式之爭,或者還在為使用哪個庫來加載配置糾結,只能說明你還沒有開發過一個嚴肅認真的大型Python應用程序。
關于Python程序讀取配置,一個嚴肅認真的大型程序,真正面臨的問題其實是這些:
現在, cfg4py為上述問題提供了一個完整的解決方案。
cfg4py是一個層次化(cascading design)、部署環境自適應(Adaptive deployment)的配置系統。 它支持配置中心化,但又能通過本地文件覆蓋全局配置;為不同的環境(開發、測試和生產環境)準備了不同的配置文件,相同的配置項提取在defaults.yaml中,使得部署過程中幾乎無須修改。
它還提供了模板功能,可以供在項目創建之初,快速配置各種服務和日志模塊。
它通過將yaml文件中的配置項編譯成為Python class,從而使得你可以享受到代碼自動補全的便捷,代碼重構也成為可能:現在你可以象重命名普通變量一樣來重命名一個配置項了!
此外,它還提供了環境變量宏,使用cfg4py,你只需要在配置文件中引用定義賬號、密碼的環境變量,程序就能最終獲得這些信息,而無須在源碼和配置文件中暴露這些秘密。
模板
當你新建一個Python工程時,你可以在安裝了cfg4py的環境下,運行 python scaffold命令,按照提示將對應的配置項加入你的工程中:
Auto-complete (自動補全)
當你寫好配置后,在命令行下運行cfg4py build,這樣就會生成一個名為cfg4py_auto_gen.py的文件,將它導入到工程中,就可以使用代碼自動提示了:
當然,每次新增或者修改了配置文件時,都需要做一次build。如果你需要對配置文件進行重構,現在變得很簡單,因為所有的配置項目都變成了對象的一個屬性,所以,如果你在開發過程中,突然覺得某個配置項的名稱不順口,沒關系,象重命名一個普通變量一樣來重構它,所以引用這個配置項的地方,都將自動更新!
使用宏來讀取環境變量
使用宏來讀取環境變量有兩個用處,一是不在任何文件中配置賬號和密碼。二是你也可以將因機器差異,而需要進行不同配置的項放進環境變量,從而使得配置文件在不同的機器上完全一致,無需修改。這樣會減少很多部署的工作,避免一些錯誤。
比如,你申請了一個第三方的服務賬號,需要配置在程序中,你當然不希望將賬號和密碼泄露出去。現在,你可以機器上定義環境變量:
export vendor_account=my_account export vendor_password=my_password然后在你的配置文件中引用它們:
# in your configuration file, for example: defaults.yaml third_party_service:account: ${vendor_account}password: ${password} # this is how you could access these secrets: cfg = cfg4py.init(...) print(cfg.third_party_service.account, cfg.thired_party_service.password)甚至開發團隊之間都不應該共享這些賬號。現在,這些賬號都配置為本機的環境變量,從而避免了泄漏。
Cascading design (多層設計)
cfg4py允許你通過遠程的中央數據源來統一進行配置。
如果這個中央數據源是redis,那么只要指定redis連接和配置項的鍵值,cfg4py將自動為你加載這些配置(按照你指定的refresh period)。注意cfg4py只支持yaml格式,所以即使這些配置不是寫在文件中,而是在cache中,它們也應該是yaml格式。
如果中央數據源是其它類型的數據庫,則你需要自己實現一個RemoteConfigFetcher, 并實現它的fetcher接口。
class MyConfigFetcher(RemoteConfigFetcher):def __init__(self, *arg, **kwargs):def fetch(self) -> str:# fetch settings from database, decode as string, and returnpass然后調用config_remote_fetcher,讓cfg4py加載這個fetcher:
fetcher = MyConfigFetcher() cfg4py.config_remote_fetcher(fetcher, interval = 500)在上述例子中,cfg4py每5分鐘會從中央數據源更新一次配置。 如果個別機器需要有自己的配置,則只需要在本地寫一個配置文件,改寫部分配置即可。cfg4py會自動完成配置的合并和改寫。
Adaptive deployment (部署環境自適應)
一個典型的cfg4py配置文件系統共有4個配置文件: 1. defaults.yaml 2. dev.yaml 3. test.yaml 4. production.yaml
通過cfg4py scaffold命令初始化后,你的工程中就會出現這些文件。然后你需要配置當前機器的角色環境變量:
export __cfg4py_server_role__=DEV這個變量名很長,不容易記憶。但是你可以在控制臺下通過cfg4py set-server-role來查看幫助,這個命令會顯示跟上面一樣的提示。
如果這個命令也太長,不容易記憶?你只要記住cfg4py就好,cfg4py提供了命令行提示,連續敲兩個tab,就會提示你所有的命令:
其它功能
更新配置是熱更新。如果配置是從本地文件加載的,更新將是實時更新;如果配置是遠程加載的,那么由你定義的更新間隔來決定。
忘記該怎么設置pip源或者conda源?試試cfg4py hint命令吧。
這么好的模塊,怎么以前沒有發現它呢?不錯,這是個新開發出來的庫,不過質量應該到了可以使用的階段了,測試覆蓋率也達到了94%。
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的8s yaml 配置生成_cfg4py:一个严肃的Python配置模块应有的风格-层级式、部署环境自适应、自动补全...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: excel 下拉框选择月份显示不同的日历
- 下一篇: solor快速_快速简单高效的搭建 So