Как узнать, была ли опция optparse передана в командной строке или по умолчанию

Используя python optparse.py, есть ли способ определить, было ли задано определенное значение параметра из командной строки или из значения по умолчанию.

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

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

Благодаря!


РЕДАКТИРОВАТЬ

Извините, моя оригинальная фраза была не очень ясной.

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

Используя значения по умолчанию, вы можете определить, соответствует ли параметр значению по умолчанию, но это все равно не говорит вам, действительно ли оно было отправлено из командной строки. Это может быть актуальным: если опция передается из командной строки и соответствует по умолчанию, если вы измените значение по умолчанию в коде, сценарий все равно получит то же значение.

Для меня было бы вполне естественно иметь эквивалент по умолчанию, содержащий фактические значения.

Чтобы сделать этот вопрос конкретным, в этом примере:

>>> sys.argv = ['myscript.py','-a','xxx'] >>> import optparse >>> parser = optparse.OptionParser() >>> parser.add_option('-a', default = 'xxx') >>> parser.add_option('-b', default = 'yyy') 

Как узнать, что опция a была передана из командной строки. Единственный способ вручную разобрать командную строку?

(Я знаю, что это довольно незначительный момент, но я подумал, что стоит спросить, если я потеряю smthing на optparse)

еще раз спасибо

3 Solutions collect form web for “Как узнать, была ли опция optparse передана в командной строке или по умолчанию”

Вместо нижеследующего кода шаблона:

 opts, args = parser.parse_args() 

если вы используете приведенный ниже код, у вас будут дополнительные значения объекта opts_no_defaults с опциями, явно указанными пользователем:

 opts_no_defaults = optparse.Values() __, args = parser.parse_args(values=opts_no_defaults) opts = Values(parser.get_default_values().__dict__) opts._update_careful(opts_no_defaults.__dict__) 

В конце opts должен быть идентичным, как в исходном шаблоне.

 print opts_no_defaults.__dict__ print opts.__dict__ for opt in parser._get_all_options(): if opt.dest: print "Value of %s: %s" % (opt._long_opts[0], getattr(opts, opt.dest)) print "Is %s specified by user? %s" % (opt._long_opts[0], hasattr(opt_no_defaults, opt.dest)) 

Не зная, что вы не можете дать лучший ответ, но …

  1. просто не передавайте значения по умолчанию парсеру и не проверяйте значения None . Значение None является значением по умолчанию для optparse lib, поэтому вы можете восстановить свой собственный по умолчанию и действовать как обычно;

  2. расширить optparse чтобы специализировать его.

Я не знаю вашу программу, но, как правило, это не очень хорошее изменение дизайна, когда конфигурация такая же.

 def is_opt_provided (parser, dest): if any (opt.dest == dest and (opt._long_opts[0] in sys.argv[1:] or opt._short_opts[0] in sys.argv[1:]) for opt in parser._get_all_options()): return True return False 

Применение:

 parser = OptionsParser() parser.add_option('-o', '--opt', dest='opt_var', ...) if is_opt_provided(parser, 'opt_var'): print "Option -o or --opt has been provided" 

Было бы здорово, если бы сопровождающие Python включили предлагаемую функцию в класс OptionParser.

  • Разбор пустых опций в Python
  • Использование файла для хранения аргументов optparse
  • Использование модуля cmd в python вместе с argparse или optparse
  • Самый пифонический способ принятия аргументов с использованием optparse
  • отображение новых строк в справочном сообщении при использовании оппонента python
  • Искусство ASCII в описании optparse
  • Как вы обрабатываете параметры, которые нельзя использовать вместе (с помощью OptionParser)?
  • optparse - почему последний символ опции можно игнорировать? С `--file` он ведет себя так же, как` --fil`
  • Как выполнить докструменты PEP 257 при использовании модуля optparse от Python?
  • Может ли optparse Python отображать значение по умолчанию для параметра?
  • понимание OptionParser
  • Python - лучший язык программирования в мире.