Argparse - 没有参数的自定义操作?

时间:2012-06-12 17:24:14

标签: python argparse

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

     

您好

4 个答案:

答案 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”。