Skip to main content

解析器类似于 ConfigParser,但用于更新配置文件

项目描述

建成状态 阅读文档 连体工作服 PyPI 服务器 康达锻造 每月下载

配置更新器

ConfigUpdater的唯一目的是轻松更新 INI 配置文件,而不会对原始文​​件进行任何更改,除了预期的文件。这意味着注释、部分和键/值对的顺序以及它们的案例都保留在原始文件中。因此 ConfigUpdater 为 Python 的ConfigParser提供了补充功能,主要用于读取配置文件和编写文件。

特征

与ConfigParser的主要区别是:

  • 更新配置文件中的最小侵入性更改,

  • 正确处理评论,

  • 一次只能更新一个配置文件,

  • 保留部分和键的原始大小写,

  • 控制新部分/键的位置

故意未实现以下功能:

  • 值的插值,

  • 从默认部分传播参数,

  • 价值观的转换,

  • 使用默认参数传递键/值对,

  • 允许重复部分和键的非严格模式。

用法

首先使用以下任一方式安装软件包:

pip install configupdater

或者:

conda install -c conda-forge configupdater

现在我们可以简单地做:

from configupdater import ConfigUpdater

updater = ConfigUpdater()
updater.read("setup.cfg")

它将读取在许多项目中找到的文件setup.cfg

要更改现有键的值,我们可以简单地执行以下操作:

updater["metadata"]["author"].value = "Alan Turing"

在任何时候,我们都可以打印配置文件的当前状态:

print(updater)

要更新读入文件,只需调用updater.update_file()updater.write(open('filename','w')) 将更改的配置文件写入另一个目的地。在实际编写之前,ConfigUpdater 会在 ConfigParser 的帮助下通过解析自动检查更新的配置文件是否仍然有效。

ConfigParser 的许多方法仍然存在,最好在模块参考中查找它们。让我们看一些例子。

添加和删​​除选项

假设我们在字符串中有以下配置:

cfg = """
[metadata]
author = Ada Lovelace
summary = The Analytical Engine
"""

我们可以添加一个许可选项,即一个键/值对,就像我们使用 ConfigParser 一样:

updater = ConfigUpdater()
updater.read_string(cfg)
updater["metadata"]["license"] = "MIT"

一个简单的print(updater)将向您显示新选项已附加到末尾:

[metadata]
author = Ada Lovelace
summary = The Analytical Engine
license = MIT

由于许可证对我们非常重要,假设我们想在摘要之前添加它 ,甚至在它之前添加一个简短的评论:

updater = ConfigUpdater()
updater.read_string(cfg)
(updater["metadata"]["summary"].add_before
                               .comment("Ada would have loved MIT")
                               .option("license", "MIT"))

这将导致:

[metadata]
author = Ada Lovelace
# Ada would have loved MIT
license = MIT
summary = Analytical Engine calculating the Bernoulli numbers

使用add_after会产生相同的结果,如下所示:

updater = ConfigUpdater()
updater.read_string(cfg)
(updater["metadata"]["author"].add_after
                              .comment("Ada would have loved MIT")
                              .option("license", "MIT"))

假设我们要将摘要重命名为更常见的描述

updater = ConfigUpdater()
updater.read_string(cfg)
updater["metadata"]["summary"].key = "description"

如果我们根本不需要摘要,我们可以做del updater["metadata"]["summary"]

添加和删​​除部分

添加和删​​除部分就像添加和删除选项一样,但在更高级别上。继续我们的Ada Lovelace示例,假设我们想在元数据之前添加一个部分选项,其中包含注释和两个新行以将其与元数据分开:

updater = ConfigUpdater()
updater.read_string(cfg)
(updater["metadata"].add_before
                    .comment("Some specific project options")
                    .section("options")
                    .space(2))

正如预期的那样,这会导致:

# Some specific project options
[options]

[metadata]
author = Ada Lovelace
summary = The Analytical Engine

我们现在可以用我们之前学到的选项来填充新部分。如果我们想重命名一个现有的部分,我们可以借助name属性来做到这一点:

updater["metadata"].name = "MetaData"

有时,不是以编程方式注入新部分,而是以更具声明性的方式注入新部分可能会很有用。假设我们已经在一个多行字符串中定义了我们的新部分:

sphinx_sect_str = """
[build_sphinx]
source_dir = docs
build_dir = docs/_build
"""

借助两个 ConfigUpdater 对象,我们可以轻松地将本节注入到我们的示例中:

sphinx = ConfigUpdater()
sphinx.read_string(sphinx_sect_str)
sphinx_sect = sphinx["build_sphinx"]

updater = ConfigUpdater()
updater.read_string(cfg)

(updater["metadata"].add_after
                    .space()
                    .section(sphinx_sect.detach()))

detach方法将从第一个对象中删除build_sphinx部分并将其添加到第二个对象。这导致:

[metadata]
author = Ada Lovelace
summary = The Analytical Engine

[build_sphinx]
source_dir = docs
build_dir = docs/_build

或者,如果您想在两个 ConfigUpdater对象中保留build_sphinx(即,防止它从第一个对象中删除,同时仍向第二个对象添加副本),您调用也依赖于 stdlib 的 copy.deepcopy函数而不是detach

from copy import deepcopy

(updater["metadata"].add_after
                    .space()
                    .section(deepcopy(sphinx_sect)))

此技术可用于 ConfigUpdater 中的所有对象:部分、选项、注释和空格。

在 ConfigUpdater 的上下文中不鼓励使用浅拷贝,因为每个配置块都保留对其容器的引用,以便轻松编辑文档。在基于浅拷贝进行编辑(例如添加或更改选项和评论)时,结果可能不可靠且出乎意料。

有关 ConfigUpdater API 如何工作的更多示例,最好查看 单元测试并阅读参考资料。

笔记

ConfigUpdater 主要是为PyScaffold开发的。

下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

ConfigUpdater-3.1.1.tar.gz (140.0 kB 查看哈希

已上传 source

内置分布

ConfigUpdater-3.1.1-py2.py3-none-any.whl (34.3 kB 查看哈希

已上传 py2 py3