采购不同的配置文件

时间:2012-11-13 19:05:18

标签: python configparser

我需要从两个配置文件中的三个不同位置读取某个路径:

  • 全球性的/etc/program.conf
  • 本地的,~/.config/program/config

本地版块有[DEFAULT]部分,可能有也可能没有特定于每个案例的部分,例如[case]。我想

  1. 阅读本地配置的案例特定部分给出的路径
  2. 缺席,请阅读本地配置默认部分给出的路径
  3. 缺席,请阅读全局配置
  4. 给出的路径
  5. 缺少(!),提供默认路径
  6. 我在Python中使用configparser。这实际上并不是一个困难的问题,但我提出的解决方案让我感到不雅和笨重。我认为,这是一个相当普遍的情况,我想我会请更多有经验的程序员寻求更好的解决方案。

    我的代码是:

    def retrieve_download_path(feed):
        download_path = os.path.expanduser('~/Downloads')
        config = configparser.ConfigParser()
        if os.path.isfile(CONFIG_FILENAME_GLOBAL):
            config.read(CONFIG_FILENAME_GLOBAL)
            if config.has_option('DEFAULT','Download directory'):
                download_path = os.path.expanduser(config['DEFAULT']['Download directory'])
        if os.path.isfile(CONFIG_FILENAME_USER):
            config.read(CONFIG_FILENAME_USER)
            if config.has_option(feed,'Download directory'):
                download_path = os.path.expanduser(config[feed]['Download directory'])
            elif config.has_option('DEFAULT','Download directory'):
                download_path = os.path.expanduser(config['DEFAULT']['Download directory'])
        return download_path
    

    我怎样才能改善这一点?采购不同配置文件的常用方法是什么?

1 个答案:

答案 0 :(得分:1)

configparser似乎为您要实施的内容提供支持,特别是多个配置文件和DEFAULT部分。

这样做你想要的吗?

def retrieve_download_path(feed):
    # Read the config files.
    config = configparser.ConfigParser()
    config.read((CONFIG_FILENAME_GLOBAL, CONFIG_FILENAME_USER))

    # Resolve the section (configparser doesn't fallback to DEFAULT if the entire section is missing).
    section = feed if config.has_section(feed) else config.default_section

    # Extract the download path.
    download_path = config.get(section, 'Download directory', fallback='~/Downloads')

    # Expand the user directory.
    return os.path.expanduser(download_path)

我看到的唯一区别是允许(并参考)全局配置文件中的DEFAULT部分(这似乎是可取的)。