python configparser中的递归扩展插值

问题描述 投票:0回答:0

我正在使用python的configparser来读取配置信息。配置使用了一些环境变量。解析器还设置为使用插值类。问题是对于需要多步插值的变量,configparser 只调用一次插值。这是一个小例子:

# test.cfg
[VERSION]
version = 10

[PATHS]
path = ${env_some_path}/${VERSION:version}

[FINAL]
works = ${env_some_path}
fails = ${PATHS:path}

解析器代码:

# test.py
import os
import configparser

os.environ['env_some_path'] = 'some_path'

class EnvInterpolation(configparser.ExtendedInterpolation):
    """ expand environment variables in values."""
    def before_get(self, parser, section, option, value, defaults):     
        value =  os.path.expandvars(value)
        return super().before_get(parser, section, option, value, defaults)
        
config = configparser.ConfigParser(interpolation=EnvInterpolation(),
        strict=False, allow_no_value=True, empty_lines_in_values=False)
config.read('test.cfg')
print(f"FINAL:works = {config.get('FINAL', 'works')}")
print(f"FINAL:fails = {config.get('FINAL', 'fails')}")

调用 config.get('FINAL', 'works') 有效并给出 some_path。 调用 config.get('FINAL', 'fails') 失败并给出错误: configparser.InterpolationMissingOptionError:错误值替换:“PATHS”部分中的选项“path”包含插值键“env_some_path”,它不是有效的选项名称。原始值:'${env_some_path}/${VERSION:version}'

问题是,对于失败的情况,调用 EnvInterpolation.before_get 的值=${PATHS:path}' 没有要扩展的环境变量。但是当解析器尝试评估 ${PATHS:path} 时,它会看到环境变量并抛出错误。

有没有办法告诉解析器在每次插值之前调用 EnvInterpolation.before_get?我如何评估这些环境变量?

谢谢

configparser
© www.soinside.com 2019 - 2024. All rights reserved.