使用 python ConfigParser 时,可以读取 2 个文件,这样它将合并两个文件,并且其行为是后面文件中的非唯一选项值会覆盖前面文件中的选项值。
参见例如https://stackoverflow.com/a/44266442/5020683
考虑该链接中给出的示例,为了完整性而将其复制到此处(感谢原作者):
config1.ini:
[shared]
prop_uniue1 = 1
prop_shared = 10
[unique1]
test_unique = 101
config2.ini:
[shared]
prop_uniue2 = 2
prop_shared = 14
[unique2]
test_unique = 102
import ConfigParser
config = ConfigParser.ConfigParser()
config.read(['config1.ini', 'config2.ini'])
print config.sections() # ['shared', 'unique1', 'unique2']
print config.get("shared", "prop_uniue1") # 1
print config.get("shared", "prop_shared") # 14
print config.get("unique1", "test_unique") # 101
print config.get("shared", "prop_uniue2") # 2
print config.get("unique2", "test_unique") # 102
是否可以配置配置解析器,使 config2 不能包含唯一的选项/部分,即只能包含 config1 中已设置的选项?
在上面的示例中,我希望它失败,因为 config2 包含选项
prop_uniue2
,该选项不在配置 1 中。
用例:
config1 被定义为默认配置。 config2 是用户提供的配置,可用于覆盖默认配置。这允许用户仅指定那些需要与默认值不同的选项,并且对默认值的更改自然传播(这种行为是期望的)。 config2 不应该能够指定任何新选项,以避免用户认为他们正在覆盖选项但实际上没有覆盖的可能性,例如拼写错误
我的方法是加载 2 个 .ini 文件并比较它们的差异:
import configparser
def readSections(config):
for s in config.sections():
for k in config.items(s):
yield k[0]
configDefault = configparser.ConfigParser()
configDefault.read(['config1.ini'])
configUser = configparser.ConfigParser()
configUser.read(['config2.ini'])
for n in [item for item in readSections(configUser) if item not in readSections(configDefault)]:
print(f'Error: {n} config is not defined on default .ini')
输出:
Error: prop_uniue2 config is not defined on default .ini