class StartAction(argparse.Action):
def __call__(self, parser, namespace, values, option_string=None):
print "Hello"
start.add_argument('-s', '--start', action=StartAction)
我知道通常让行为像'store_true'会阻止参数的要求,但是有没有办法使用自定义动作并且仍然不需要传递参数?
所以我想要的是:
python example.py -s
您好
答案 0 :(得分:15)
尝试将nargs=0
添加到start.add_argument
:
start.add_argument('-s', '--start', action=StartAction, nargs=0)
答案 1 :(得分:5)
正如mgilson suggested nargs=0
所做的那样。由于它是你的行动所固有的,我会把它放在行动中:
class StartAction(argparse.Action):
def __init__(self, nargs=0, **kw):
super().__init__(nargs=nargs, **kw)
def __call__(self, parser, namespace, values, option_string=None):
print "Hello"
start.add_argument('-s', '--start', action=StartAction)
并且您拥有所需的行为,而不必为每个nargs=0
电话添加add_argument()
。如果你有多个参数以相同的方式工作,那就很好。
但是,如问题中所示,用户仍然可以覆盖默认的nargs=0
,这对于您的用例来说是愚蠢的。所以我会强制执行它:
class StartAction(argparse.Action):
def __init__(self, nargs=0, **kw):
if nargs != 0:
raise ValueError('nargs for StartAction must be 0; it is '
'just a flag.')
super().__init__(nargs=nargs, **kw)
def __call__(self, parser, namespace, values, option_string=None):
print "Hello"
答案 2 :(得分:0)
在参考了上述内容并尝试了不同的方法之后,我编写了此示例。这是一个实现“ Uncount”帐户的类,与“ count”操作相反。
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)
答案 3 :(得分:0)
对于在2020年发现此问题的任何人: 如果您尝试在python3的最新argparse软件包中传递nargs = 0,它将出现以下错误:
ValueError: nargs for store actions must be != 0; if you have nothing to store, actions such as store true or store const may be more appropriate
您可能正在寻找的解决方案是传递action =“ store_const”和const = True
示例:
parser = argparse.ArgumentParser
parser.add_argument('-s', '--start', help='Start script or whatever', action="store_const", const=True)
当-s参数传递到脚本的主要/其余部分时,这会将parser.start的值设置为等于“ True”。