1

2 つの構成ファイルの 3 つの異なる場所から特定のパスを読み取る必要があります。

  • グローバルなもの、/etc/program.conf
  • 地元のもの、~/.config/program/config

ローカルのものには[DEFAULT]セクションがあり、ケースごとに特定のセクションがある場合とない場合があります[case]。そうしたいです。

  1. ローカル構成のケース固有のセクションで指定されたパスを読み取ります
  2. それがない場合は、ローカル構成のデフォルト セクションで指定されたパスを読み取ります
  3. それがない場合は、グローバル構成によって指定されたパスを読み取ります
  4. それがない場合 (!)、デフォルト パスを指定します

私はconfigparserPythonで使用しています。これは実際には難しい問題ではありませんが、私が思いついた解決策は、洗練されておらず不格好だと思います。これはかなり一般的な状況だと思うので、より経験豊富なプログラマーにもっと良い解決策を求めるべきだと思いました。

私が持っているコードはこれです:

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

どうすればこれを改善できますか? さまざまな構成ファイルを調達する通常の方法は何ですか?

4

1 に答える 1

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私が見る唯一の違いは、グローバル構成ファイルのセクションを許可 (および参照) することです (これは望ましいと思われます)。

于 2012-11-13T20:08:46.950 に答える