python - 在插值中使用先前配置文件中的值

标签 python configuration-files string-interpolation

我正在使用一个程序,该程序使用 python 的 configparser.ConfigParser 来处理配置文件作为构建事物的指令。它的设置使得可以指定多个命令行文件参数,并且后面的文件中的规范会覆盖早期文件中设置的内容。

这意味着我可以在 trivial.ini 文件中设置基本模型

[admin]
basename = trivial_model
[model basic]
data = data.tsv

并用更复杂的模型扩展它extension.ini

[admin]
basename = trivial_model_extended
[model basic]
model = bsvs

program trivial.ini extension.ini的行为就好像它已经得到了

[admin]
basename = trivial_model_extended
[model basic]
data = data.tsv
model = bsvs

现在最好编写一个更加模块化的文件,以便能够组合多个此类扩展而无需过多关心细节,并为每个扩展提供不同的基本文件名。我想这也许可行

[admin]
basename = %(basename)s_extended
[model basic]
model = bsvs

但是在当前的实现中,我得到了 configparser.InterpolationDepthError: Recursion limit Been gone in value replacement: option 'basename' in section 'admin' contains an interpolation key that can't be 10 Steps 替换。原始值:'%(basename)s_extended'

是否有一种简单、内置或优雅的方式来启用这样的增量规范,无论是通过更改当前的实现(这似乎归结为

parser.add_argument(
    "config",
    nargs="+")

args = parser.parse_args()
c = configparser.ConfigParser()
for conf in args.config:
    c.read(conf)

)或通过配置文件中的一些巧妙的[default]部分或值(或两者,如果需要的话)?

最佳答案

一些评论:

  • 您不能像上面那样递归 basename 定义。我的方法是使用 [DEFAULT] 部分,其中包含 basename 以外的内容,例如,trivial.ini 可能如下所示:

    [DEFAULT]
    basename_default = default from trivial.ini
    
    [admin]
    basename = trivial_model
    
    [model basic]
    data = data.tsv
    
  • 请注意,[DEFAULT] 部分需要全部大写

  • 接下来,我可能有一个附加的 .ini 文件,我将其称为 more.ini,它看起来像这样:

    [admin]
    basename = %(basename_default)s and more
    
  • 此外,您不需要循环来读取配置文件:只需为 read() 方法提供一个文件名列表,后面的文件将覆盖第一个文件。

放在一起:

parser = argparse.ArgumentParser()
parser.add_argument("config", nargs="+")
args = parser.parse_args('trivial.ini extension.ini more.ini'.split())

cfg = ConfigParser.ConfigParser()
cfg.read(args.config)

admin = 'admin'
model_basic = 'model basic'

print('basename:', cfg.get(admin, 'basename'))
print('defaults:', cfg.defaults())

输出:

basename: default from trivial.ini and more
defaults: OrderedDict([('basename_default', 'default from trivial.ini')])

关于python - 在插值中使用先前配置文件中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41720747/

相关文章:

java - 如何在类(class)之间获取配置文件?

使用自定义占位符进行字符串格式化的 Python 库

javascript - Sequelize 语法错误 (N\')

python - 列表基于 Python 中的值重新分组

python - Python 异常后是否需要返回语句?

python - 如果一个项目可能不存在于列表中,我们是否仍然可以使用 if-else 来检查条件?

python - DRBD 配置文件格式是标准格式吗?

linux - XCRC 命令导致 550 回复

arrays - 如何从 Powershell 中的值数组创建文本文件

python - 为什么 read() 不能在 open() 函数 python 中使用 'w+' 或 'r+' 模式