跳转到主要内容

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

项目描述

Built Status ReadTheDocs Coveralls PyPI-Server Conda-Forge Monthly Downloads Sponsor me

Config Updater

ConfigUpdater的唯一目的是轻松更新INI配置文件,除所需更改外,不对原始文件进行任何更改。这意味着注释、部分顺序以及键/值对的顺序和大小写都保持与原始文件相同。因此,ConfigUpdater为Python的ConfigParser提供了补充功能,后者主要用于读取配置文件和写入文件。

功能

ConfigParser相比,主要区别包括

  • 在更新配置文件时进行最小侵入性更改,

  • 正确处理注释,

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

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

  • 控制新部分/键的位置

以下功能是故意不实现

  • 值插值,

  • 从默认部分传播参数,

  • 转换值,

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

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

用法

首先使用以下任一方法安装包

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一样添加一个license选项,即键/值对

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

简单的print(updater)将显示新选项已附加到末尾

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

由于许可证对我们来说非常重要,让我们说我们想要在summary之前添加它,甚至在它之前添加一个简短的注释

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"))

假设我们想将summary重命名为更常见的description

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

如果我们想完全删除摘要,我们可以简单地做del updater["metadata"]["summary"]

添加和删除部分

添加和删除部分的工作方式与添加和删除选项相同,但处于更高层次。继续我们的Ada Lovelace示例,假设我们想在metadata之前添加一个名为options的部分,并添加注释和两个新行以将其与metadata分开

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

如预期,这会产生

[options]
# Some specific project 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.2.tar.gz (140.6 kB 查看哈希值

上传时间:

构建分布

ConfigUpdater-3.2-py2.py3-none-any.whl (34.7 kB 查看哈希值

上传时间: Python 2 Python 3

由以下机构支持