解析器类似于 ConfigParser,但用于更新配置文件
项目描述
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 的哈希值
| 算法 | 哈希摘要 | |
|---|---|---|
| SHA256 | 46f0c74d73efa723776764b43c9739f68052495dd3d734319c1d0eb58511f15b |
|
| MD5 | f72831b715e20240ff99648551cf85cd |
|
| 布莱克2-256 | 1a3e3dc189e7127ddc594540146c79244a471fdb27362ebe35626c6760c10e6f |
ConfigUpdater -3.1.1-py2.py3-none-any.whl 的哈希值
| 算法 | 哈希摘要 | |
|---|---|---|
| SHA256 | 805986dbeba317886c7a8d348b2e34986dc9e3128cd3761ecc35decbd372b286 |
|
| MD5 | 5edc6dffd340fc395497d65928aaa35f |
|
| 布莱克2-256 | 4d136791bba527baf3648be8aabaf6d3775027c3ebbf4000f2ae16867911b879 |