邁向輕鬆的 Python 設定檔版本 1
介紹
正如上一篇文章所述,簡化版本充滿了可擴展性、可維護性和可擴展性等問題。
版本 Ø 的一個簡單擴充是嘗試將 Python 配置詳細資訊隱藏在屬性類別後面。 這是實作一個偽資料類,它公開一組屬性,允許開發人員簡單地執行屬性 set 和 get 呼叫來檢索和保留屬性值。
從維護者的角度來看,此實作應該支援以下功能。
- 允許自動建立配置節(如果缺少)
- 允許自動建立屬性值(如果缺失)
- 屬性應該實作為讀通和寫通。
- 為了避免上述啟動成本,因為應用程式在整個應用程式中實例化此類,該類別應該是單例。
班級代表
下面的 UML 類別圖描述了一個滿足簡介中要求的類別。 ConfiguratonProperties 類別透過受保護的方法 .createMissingSections 和 .createMissingKeys
滿足要求 1 和 2創建實施
創建缺少的部分
以下程式碼顯示了實作。 請注意,其他部分需要對此方法進行程式碼更新
SECTION_GENERAL: str = 'General' SECTION_DATABASE: str = 'Database' def _createMissingSections(self): """ Create missing sections. Add additional calls for each defined section """ self._createMissingSection(SECTION_GENERAL) self._createMissingSection(SECTION_DATABASE)
缺失部分代碼如下
def _createMissingSection(self, sectionName: str): """ Only gets created if it is missing Args: sectionName: The potential section to create """ hasSection: bool = self._configParser.has_section(sectionName) self.logger.info(f'hasSection: {hasSection} - {sectionName}') if hasSection is False: self._configParser.add_section(sectionName)
建立遺失的鑰匙
以下程式碼顯示了實作。 再次注意,如果我們新增附加部分,開發人員必須為新部分新增附加循環。
GENERAL_PREFERENCES: Dict[str, str] = { 'debug': 'False', 'logLevel': 'Info' } DATABASE_PREFERENCES: Dict[str, str] = { 'dbName': 'example_db', 'dbHost': 'localhost', 'dbPort': '5432' } def _createMissingKeys(self): """ Create missing keys and their values. Add additional calls for each defined section. """ for keyName, keyValue in GENERAL_PREFERENCES.items(): self._createMissingKey(sectionName=SECTION_GENERAL, keyName=keyName, defaultValue=keyValue) for keyName, keyValue in DATABASE_PREFERENCES.items(): self._createMissingKey(sectionName=SECTION_DATABASE, keyName=keyName, defaultValue=keyValue)
缺失的關鍵程式碼如下。 請注意,任何遺失的密鑰都會立即保留。
def _createMissingKey(self, sectionName: str, keyName: str, defaultValue: str): """ Only gets created if it is missing. The configuration file is updated immediately for each missing key and its value Args: sectionName: The section name where the key resides keyName: The key name defaultValue: Itsß value """ if self._configParser.has_option(sectionName, keyName) is False: self._configParser.set(sectionName, keyName, defaultValue) self._saveConfiguration()
類別屬性
要求 3 的範例實作如下。
字串屬性
請注意,透過設定屬性並立即保留它,設定屬性會直寫到設定檔。 讀取屬性其實是通讀,因為我們如何立即寫入設定屬性。
@property def dbName(self) -> str: return self._configParser.get(SECTION_DATABASE, 'dbName') @dbName.setter def dbName(self, newValue: str): self._configParser.set(SECTION_DATABASE, 'dbName', newValue) self._saveConfiguration()
整數屬性
整數屬性使用 .getint 方法來檢索值。 設定屬性時,開發人員必須手動將其轉換為字串。
@property def dbPort(self) -> int: return self._configParser.getint(SECTION_DATABASE, 'dbPort') @dbPort.setter def dbPort(self, newValue: int): self._configParser.set(SECTION_DATABASE, 'dbPort', str(newValue)) self._saveConfiguration()
布爾屬性
布林屬性使用 .getboolean 方法來檢索它們的值。 設定屬性時,開發人員必須手動將其轉換為字串。
SECTION_GENERAL: str = 'General' SECTION_DATABASE: str = 'Database' def _createMissingSections(self): """ Create missing sections. Add additional calls for each defined section """ self._createMissingSection(SECTION_GENERAL) self._createMissingSection(SECTION_DATABASE)
列舉屬性
我不會在本文中介紹枚舉屬性。 有兩種方法可以透過名稱或值來保存它們。 每種機制都需要稍微不同的方式將值反序列化回枚舉類型。
訪問和修改屬性
以下程式碼片段示範如何存取和修改屬性。
def _createMissingSection(self, sectionName: str): """ Only gets created if it is missing Args: sectionName: The potential section to create """ hasSection: bool = self._configParser.has_section(sectionName) self.logger.info(f'hasSection: {hasSection} - {sectionName}') if hasSection is False: self._configParser.add_section(sectionName)
上面的程式碼片段產生以下輸出
GENERAL_PREFERENCES: Dict[str, str] = { 'debug': 'False', 'logLevel': 'Info' } DATABASE_PREFERENCES: Dict[str, str] = { 'dbName': 'example_db', 'dbHost': 'localhost', 'dbPort': '5432' } def _createMissingKeys(self): """ Create missing keys and their values. Add additional calls for each defined section. """ for keyName, keyValue in GENERAL_PREFERENCES.items(): self._createMissingKey(sectionName=SECTION_GENERAL, keyName=keyName, defaultValue=keyValue) for keyName, keyValue in DATABASE_PREFERENCES.items(): self._createMissingKey(sectionName=SECTION_DATABASE, keyName=keyName, defaultValue=keyValue)
結論
本文的原始碼在這裡。 支援類SingletonV3在這裡
實現的結果最初讓我作為程式碼的使用者感到滿意。 我能夠取得和設定類型屬性。 然而,作為程式碼的維護者,每當我新增新的部分和新的屬性時,我都必須手動更新程式碼資料結構和程式碼循環。 此外,我真正從中得到的只是一種在不同應用程式中需要新配置屬性時使用的機制/模式。
優點
- 輕鬆型別安全地存取應用程式屬性
- 在應用程式的不同部分呼叫單例可以提供對屬性的一致且可靠的訪問,無論應用程式的哪個部分修改了值
缺點
- 新增屬性的更新很乏味
- 大量樣板代碼
- 無法跨各種應用程式重複使用。 本質上,我只有一個模板
請參閱我的下一篇文章,其中記錄了替代實現,以解決我列出的缺點,同時保留優點。
以上是邁向輕鬆的 Python 設定檔版本 1的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Python适合数据科学、Web开发和自动化任务,而C 适用于系统编程、游戏开发和嵌入式系统。Python以简洁和强大的生态系统著称,C 则以高性能和底层控制能力闻名。

Python在遊戲和GUI開發中表現出色。 1)遊戲開發使用Pygame,提供繪圖、音頻等功能,適合創建2D遊戲。 2)GUI開發可選擇Tkinter或PyQt,Tkinter簡單易用,PyQt功能豐富,適合專業開發。

Python更易學且易用,C 則更強大但複雜。 1.Python語法簡潔,適合初學者,動態類型和自動內存管理使其易用,但可能導致運行時錯誤。 2.C 提供低級控制和高級特性,適合高性能應用,但學習門檻高,需手動管理內存和類型安全。

要在有限的時間內最大化學習Python的效率,可以使用Python的datetime、time和schedule模塊。 1.datetime模塊用於記錄和規劃學習時間。 2.time模塊幫助設置學習和休息時間。 3.schedule模塊自動化安排每週學習任務。

Python在開發效率上優於C ,但C 在執行性能上更高。 1.Python的簡潔語法和豐富庫提高開發效率。 2.C 的編譯型特性和硬件控制提升執行性能。選擇時需根據項目需求權衡開發速度與執行效率。

Python在自動化、腳本編寫和任務管理中表現出色。 1)自動化:通過標準庫如os、shutil實現文件備份。 2)腳本編寫:使用psutil庫監控系統資源。 3)任務管理:利用schedule庫調度任務。 Python的易用性和豐富庫支持使其在這些領域中成為首選工具。

pythonlistsarepartofthestAndArdLibrary,herilearRaysarenot.listsarebuilt-In,多功能,和Rused ForStoringCollections,而EasaraySaraySaraySaraysaraySaraySaraysaraySaraysarrayModuleandleandleandlesscommonlyusedDduetolimitedFunctionalityFunctionalityFunctionality。

每天學習Python兩個小時是否足夠?這取決於你的目標和學習方法。 1)制定清晰的學習計劃,2)選擇合適的學習資源和方法,3)動手實踐和復習鞏固,可以在這段時間內逐步掌握Python的基本知識和高級功能。
