#python #optparse
#python #optparse
Вопрос:
Возьмите следующий довольно стандартный код:
from optparse import OptionParser
opts = OptionParser()
opts.add_option('-f', action="store_true")
opts.add_option("-x", dest="x", type="int", default=1)
options, args = opts.parse_args()
Предположим, что -x
и -f
являются взаимоисключающими: когда -x
и -f
оба присутствуют явно, должно быть сообщено об ошибке.
Как мне определить, присутствует ли -x
явно? Даже если это не так, options
укажите значение по умолчанию.
Одним из способов было бы избежать установки значения по умолчанию, чего я скорее не буду делать, потому что --help
значения по умолчанию выводятся красиво.
Другим способом была бы проверка sys.argv
на наличие экземпляров -x
, что тоже немного неудобно, если для -x
существует более одного имени (то есть —long-name) и более одной пары взаимоисключающих опций.
Есть ли элегантное решение для этого?
Ответ №1:
Вы можете добиться этого с optparse
помощью обратного вызова. Построение на основе вашего кода:
from optparse import OptionParser
def set_x(option, opt, value, parser):
parser.values.x = value
parser.values.x_set_explicitly = True
opts = OptionParser()
opts.add_option('-f', action="store_true")
opts.add_option("-x", dest="x", type="int", default=1, action='callback',
callback=set_x)
options, args = opts.parse_args()
opts.values.ensure_value('x_set_explicitly', False)
if options.x_set_explicitly and options.f:
opts.error('options -x and -f are mutually exclusive')
Давайте пока вызовем этот скрипт op.py
. Если я это сделаю python op.py -x 1 -f
, ответ будет:
Использование: op.py [параметры]
op.py : ошибка: параметры -x и -f являются взаимоисключающими
Ответ №2:
Используйте argparse. Там есть раздел для взаимоисключающих групп:
argparse.add_mutually_exclusive_group(обязательно=False)
Создайте взаимоисключающую группу. argparse удостоверится, что в командной строке присутствовал только один из аргументов во взаимоисключающей группе:
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> group = parser.add_mutually_exclusive_group()
>>> group.add_argument('--foo', action='store_true')
>>> group.add_argument('--bar', action='store_false')
>>> parser.parse_args(['--foo'])
Namespace(bar=True, foo=True)
>>> parser.parse_args(['--bar'])
Namespace(bar=False, foo=False)
>>> parser.parse_args(['--foo', '--bar'])
usage: PROG [-h] [--foo | --bar]
PROG: error: argument --bar: not allowed with argument --foo
optparse в любом случае не рекомендуется.