15
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

4 回答 4

20

尝试添加nargs=0到您的start.add_argument

start.add_argument('-s', '--start', action=StartAction, nargs=0)
于 2012-06-12T17:55:07.610 回答
8

正如mgilson 所建议 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"
于 2016-06-03T12:13:39.993 回答
1

在查阅了上述内容并尝试了不同的方法后,我编写了这个示例。这是一个实现“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)
于 2018-10-28T13:59:44.240 回答
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”。

于 2020-10-24T14:40:10.327 回答