首頁 >後端開發 >Python教學 >邁向輕鬆的 Python 設定檔版本 1

邁向輕鬆的 Python 設定檔版本 1

Susan Sarandon
Susan Sarandon原創
2024-12-02 14:55:19735瀏覽

介紹

正如上一篇文章所述,簡化版本充滿了可擴展性、可維護性和可擴展性等問題。

版本 Ø 的一個簡單擴充是嘗試將 Python 配置詳細資訊隱藏在屬性類別後面。 這是實作一個偽資料類,它公開一組屬性,允許開發人員簡單地執行屬性 setget 呼叫來檢索和保留屬性值。

從維護者的角度來看,此實作應該支援以下功能。

  1. 允許自動建立配置節(如果缺少)
  2. 允許自動建立屬性值(如果缺失)
  3. 屬性應該實作為讀通和寫通。
  4. 為了避免上述啟動成本,因為應用程式在整個應用程式中實例化此類,該類別應該是單例。

班級代表

下面的 UML 類別圖描述了一個滿足簡介中要求的類別。 ConfiguratonProperties 類別透過受保護的方法 .createMissingSections 和 .createMissingKeys

滿足要求 1 和 2

Towards Effortless Python Configuration Files Version 1

創建實施

創建缺少的部分

以下程式碼顯示了實作。 請注意,其他部分需要對此方法進行程式碼更新

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn