类似于ConfigParser的解析器,但用于更新配置文件
项目描述
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的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 9fdac53831c1b062929bf398b649b87ca30e7f1a735f3fbf482072804106306b |
|
MD5 | 3ceb028287e357e19aa98ce3d362eebb |
|
BLAKE2b-256 | 2bf4603bd8a65e040b23d25b5843836297b0f4e430f509d8ed2ef8f072fb4127 |
ConfigUpdater-3.2-py2.py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 0f65a041627d7693840b4dd743581db4c441c97195298a29d075f91b79539df2 |
|
MD5 | 1394bce9dbb46ca8a6190475aaf62347 |
|
BLAKE2b-256 | e7f0b59cb7613d9d0f866b6ff247c5953ad78363c27ff5d684a2a98899ab8220 |