上記を参考にして、さまざまな方法を試した後、この例を書きました。これは、「count」アクションの反対である「Uncount」acount を実装するクラスです。
import argparse
class Uncount(argparse.Action):
def __init__(self, option_strings, dest, nargs=0, choices=None, const=None, **kwargs):
if nargs != 0:
raise ValueError("no arguments to this parameter are allowed")
if const is not None:
raise ValueError("this parameter does not permit constants")
if choices is not None:
raise ValueError("no choices to this parameter are allowed")
super(Uncount, self).__init__(option_strings=option_strings, nargs=nargs, dest=dest,**kwargs)
def __call__(self, parser, namespace, values, option_string=None):
value = getattr(namespace, self.dest, 0)
setattr(namespace, self.dest, value-1)
opts={}
argparser = argparse.ArgumentParser(description='Report on other teams')
argparser.add_argument(
'-v','--verbose',dest='verbose',default=0,action='count',
help='increase log level',
)
argparser.add_argument(
'-q','--quiet',dest='verbose',default=0,action=Uncount,
help='increase log level',
)
例:
>>> argparser.parse_args('-q -q'.split())
Namespace(verbose=-2)
>>> argparser.parse_args('-q -v'.split())
Namespace(verbose=0)
>>> argparser.parse_args('-q -v -v'.split())
Namespace(verbose=1)