迈向轻松的 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功能丰富,适合专业开发。

2小时内可以学会Python的基本编程概念和技能。1.学习变量和数据类型,2.掌握控制流(条件语句和循环),3.理解函数的定义和使用,4.通过简单示例和代码片段快速上手Python编程。

两小时内可以学到Python的基础知识。1.学习变量和数据类型,2.掌握控制结构如if语句和循环,3.了解函数的定义和使用。这些将帮助你开始编写简单的Python程序。

Python更易学且易用,C 则更强大但复杂。1.Python语法简洁,适合初学者,动态类型和自动内存管理使其易用,但可能导致运行时错误。2.C 提供低级控制和高级特性,适合高性能应用,但学习门槛高,需手动管理内存和类型安全。

要在有限的时间内最大化学习Python的效率,可以使用Python的datetime、time和schedule模块。1.datetime模块用于记录和规划学习时间。2.time模块帮助设置学习和休息时间。3.schedule模块自动化安排每周学习任务。

Python在web开发、数据科学、机器学习、自动化和脚本编写等领域有广泛应用。1)在web开发中,Django和Flask框架简化了开发过程。2)数据科学和机器学习领域,NumPy、Pandas、Scikit-learn和TensorFlow库提供了强大支持。3)自动化和脚本编写方面,Python适用于自动化测试和系统管理等任务。

Python在自动化、脚本编写和任务管理中表现出色。1)自动化:通过标准库如os、shutil实现文件备份。2)脚本编写:使用psutil库监控系统资源。3)任务管理:利用schedule库调度任务。Python的易用性和丰富库支持使其在这些领域中成为首选工具。
