Расширяя ответ unutbu, вот пользовательское действие, включающее обработку комбинации --quiet / -q. Это проверено в Python3. Использование его в Python> = 2.7 не должно быть проблемой.
class ActionVerbose(argparse.Action):
def __call__(self, parser, args, values, option_string=None):
#print(parser, args, values, option_string)
# Obtain previously set value in case this option call is incr/decr only
if args.verbose == None:
base = 0
else:
base = args.verbose
# One incr/decr is determined in name of option in use (--quiet/-q/-v/--verbose)
option_string = option_string.lstrip('-')
if option_string[0] == 'q':
incr = -1
elif option_string[0] == 'v':
incr = 1
else:
raise argparse.ArgumentError(self,
'Option string for verbosity must start with v(erbose) or q(uiet)')
# Determine if option only or values provided
if values==None:
values = base + incr
else:
# Values might be an absolute integer verbosity level or more 'q'/'v' combinations
try:
values = int(values)
except ValueError:
values = values.lower()
if not re.match('^[vq]+$', values):
raise argparse.ArgumentError(self,
"Option string for -v/-q must contain only further 'v'/'q' letters")
values = base + incr + values.count('v') - values.count('q')
setattr(args, self.dest, values)
@classmethod
def add_to_parser(cls,
parser, dest='verbose', default=0,
help_detail='(0:errors, 1:info, 2:debug)'):
parser.add_argument('--verbose', nargs='?', action=ActionVerbose, dest=dest, metavar='level',
default=default,
help='Increase or set level of verbosity {}'.format(help_detail))
parser.add_argument('-v', nargs='?', action=ActionVerbose, dest=dest, metavar='level',
help='Increase or set level of verbosity')
parser.add_argument('--quiet', nargs='?', action=ActionVerbose, dest=dest, metavar='level',
help='Decrease or set level of verbosity')
parser.add_argument('-q', nargs='?', action=ActionVerbose, dest=dest, metavar='level',
help='Decrease or set level of verbosity')
Существует метод класса удобства, который можно использовать для настройки всех четырех обработчиков опций для --verbose
, -v
, -q
, --quiet
. Используйте это так:
parser = argparse.ArgumentParser()
ActionVerbose.add_to_parser(parser, default=defaults['verbose'])
# add more arguments here with: parser.add_argument(...)
args = parser.parse_args()
При использовании скрипта с такими аргументами вы можете сделать:
./script -vvvvvv -v 4 -v 0 -v -vvv --verbose --quiet 2 -v qqvvqvv
С этой командной строкой args.verbose
будет 4
.
- Любой
-v/-q/--verbose/--quiet
с данным числом является жестким абсолютным набором args.verbose
для данного числа (= уровень многословия).
- Любой
-v/--verbose
без номера является приращением этого уровня.
- Любой
-q/--quiet
без числа является уменьшением этого уровня.
- Любой
-v/-q
может сразу же сопровождаться большим количеством букв v/q
, итоговый уровень равен the old level + sum(count('v')) - sum(count('q'))
- Общее значение по умолчанию: 0
Настраиваемое действие должно быть довольно легко изменить, если вы хотите другое поведение. Например, некоторые люди предпочитают, чтобы любой --quiet
сбрасывал уровень до 0 или даже до -1. Для этого удалите nargs
из аргумента add_argument -q
и --quiet
, а также введите жесткий код для установки value = 0
if option_string[0] == 'q'
.
Правильные ошибки парсера красиво выводятся, если используется неправильно:
./script -vvvvvv -v 4 -v 0 -v -vvv --verbose --quiet 2 -v qqvvqvav
usage: script [-h] [--verbose [level]]
[-v [level]] [--quiet [level]] [-q [level]]
script: error: argument -v: Option string for -v/-q must contain only further 'v'/'q' letters