正如上一篇文章所述,簡化版本充滿了可擴展性、可維護性和可擴展性等問題。
版本 Ø 的一個簡單擴充是嘗試將 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中文網其他相關文章!