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
、の 4 つのオプション ハンドラすべてを設定するために使用できる便利なクラス メソッドがあります--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
たとえば、 anyがレベルを 0 または -1 にリセットすることを好む人もいます。このために、 と の add_argumentからnargs
を削除し、さらにset にハードコードします。-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