이전 기사에서 언급했듯이 단순한 버전은 확장성, 유지 관리성, 확장성 등의 문제가 많습니다.
버전 Ø의 간단한 확장은 속성 클래스 뒤에 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!