我正在使用一个程序,该程序使用 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/