Используя файл для хранения optparse аргументов

В одном ответе на этот вопрос говорится, что КАВЫЧКА “creates перечисляет данные structures”. Это не совершенно правильно. КАВЫЧКА более фундаментальна, чем это. На самом деле КАВЫЧКА является тривиальным оператором: Его цель к , предотвращают что-либо от случая вообще. В частности, это ничего не создает.

то, Какую (КАВЫЧКУ X) говорит, в основном “don't, делают что-либо, просто дают мне, X.” X не должен быть списком как в (КАВЫЧКА (B C)) или символ как в (НЕЧТО КАВЫЧКИ). Это может быть любой объект вообще. Действительно, результат оценки списка, который производится (СПИСОК 'ЗАКЛЮЧАЮТ НЕКОТОРЫМ В КАВЫЧКИ - ОБЪЕКТ) будет всегда просто возвращать НЕКОТОРЫХ - ОБЪЕКТ, независимо от того, что это.

Теперь, причина, которая (КАВЫЧКА (B C)) кажется, как будто она создала список, элементы которого являются A, B, и C - то, что такой список действительно - то, что она возвращает; но в то время, когда форма КАВЫЧКИ оценена, список обычно уже был существующим некоторое время (как компонент формы КАВЫЧКИ!), созданный или загрузчиком или читателем до выполнения кода.

Одна импликация этого, которое имеет тенденцию сбивать с толку новичков справедливо часто, - то, что очень неблагоразумно изменить список, возвращенный формой КАВЫЧКИ. Данные, возвращенные КАВЫЧКОЙ, нужно, во всех отношениях, рассмотреть как часть код выполняемый и нужно поэтому рассматривать как только для чтения!

15
задан pufferfish 11 December 2009 в 07:03
поделиться

4 ответа

Я согласен с идеей С.Лотта об использовании файла конфигурации, но я бы рекомендовал использовать встроенный модуль ConfigParser (configparser в 3.0) для его анализа, а не домашнее решение.

Вот краткий сценарий, иллюстрирующий работу ConfigParser и optparse .

import ConfigParser
from optparse import OptionParser

CONFIG_FILENAME = 'defaults.cfg'

def main():
    config = ConfigParser.ConfigParser()
    config.read(CONFIG_FILENAME)

    parser = OptionParser()
    parser.add_option("-l",
                      "--language",
                      dest="language",
                      help="The UI language",
                      default=config.get("Localization", "language"))
    parser.add_option("-f",
                      "--flag",
                      dest="flag",
                      help="The country flag",
                      default=config.get("Localization", "flag"))

    print parser.parse_args()

if __name__ == "__main__":
    main()

Вывод:

(<Values at 0x2182c88: {'flag': 'japan.png', 'language': 'Japanese'}>, [])

Запуск с « parser.py --language = Французский ":

(<Values at 0x2215c60: {'flag': 'japan.png', 'language': 'French'}>, [])

Встроенная справка. Запустите с " parser.py --help ":

Usage: parser.py [options]

Options:
  -h, --help            show this help message and exit
  -l LANGUAGE, --language=LANGUAGE
                        The UI language
  -f FLAG, --flag=FLAG  The country flag

Файл конфигурации:

[Localization]
language=Japanese
flag=japan.png
23
ответ дан 1 December 2019 в 01:05
поделиться

Для этого можно использовать модуль argparse :

>>> open('args.txt', 'w').write('-f\nbar')
>>> parser = argparse.ArgumentParser(fromfile_prefix_chars='@')
>>> parser.add_argument('-f')
>>> parser.parse_args(['-f', 'foo', '@args.txt'])
Namespace(f='bar')

Он может быть включен в stdlib, см. pep 389 .

7
ответ дан 1 December 2019 в 01:05
поделиться

Для этого предназначена функция set_defaults . http://docs.python.org/library/optparse.html#optparse.OptionParser.set_defaults

Создайте файл, который является словарем значений по умолчанию.

{ 'arg1': 'this',
'arg2': 'that'
}

Затем прочтите этот файл, оцените его, чтобы преобразовать текст в словарь и предоставьте этот словарь в качестве аргументов для set_defaults .

Если вас действительно беспокоит eval , тогда используйте нотацию JSON (или YAML) для этого файла . Или вы даже можете сделать из него файл .INI и использовать configparser для получения значений по умолчанию.

Или вы можете использовать простой список операторов присваивания и exec .

Файл конфигурации.

arg1 = 'this'
arg2 = 'that'

Чтение файла конфигурации.

defaults= {}
with open('defaults.py','r') as config
    exec config in {}, defaults
3
ответ дан 1 December 2019 в 01:05
поделиться

У меня была аналогичная проблема, но я также хотел указать файл конфигурации в качестве аргумента. Вдохновленный ответом С. Лотта, я придумал следующий код.

Пример терминального сеанса:

$ python defaultconf.py # use hard-coded defaults
False
$ python defaultconf.py --verbose # verbose on command line
True
$ python defaultconf.py --loadconfig blah # load config with 'verbose':True
True
$ python defaultconf.py --loadconfig blah --quiet # Override configured value
False

Код:

#!/usr/bin/env python2.6
import optparse

def getParser(defaults):
    """Create and return an OptionParser instance, with supplied defaults
    """
    o = optparse.OptionParser()
    o.set_defaults(**defaults)
    o.add_option("--verbose", dest = "verbose", action="store_true")
    o.add_option("--quiet", dest = "verbose", action="store_false")

    o.add_option("--loadconfig", dest = "loadconfig")

    return o


def main():
    # Hard coded defaults (including non-command-line-argument options)
    my_defaults = {'verbose': False, 'config_only_variable': 42}

    # Initially parse arguments
    opts, args = getParser(my_defaults).parse_args()

    if opts.loadconfig is not None:
        # Load config from disk, update the defaults dictionary, and reparse
        # Could use ConfigParser, simplejson, yaml etc.

        config_file_values = {'verbose': True} # the dict loaded from disk

        my_defaults.update(config_file_values)
        opts, args = getParser(my_defaults).parse_args()

    print opts.verbose

if __name__ == '__main__':
    main()

Практическую реализацию можно найти на Github: Словарь по умолчанию , синтаксический анализатор аргументов и основная функция

4
ответ дан 1 December 2019 в 01:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: