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

Tak*_*kun 11 python argparse

class StartAction(argparse.Action):
    def __call__(self, parser, namespace, values, option_string=None):
        print "Hello"

start.add_argument('-s', '--start', action=StartAction)
Run Code Online (Sandbox Code Playgroud)

我知道通常让行为像'store_true'会阻止参数的要求,但是有没有办法使用自定义动作并且仍然不需要传递参数?

所以我想要的是:

python example.py -s

你好

mgi*_*son 17

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

start.add_argument('-s', '--start', action=StartAction, nargs=0)
Run Code Online (Sandbox Code Playgroud)

  • ValueError:商店操作的nargs必须> 0; 如果您没有要存储的内容,那么诸如store true或store const之类的操作可能更合适 (2认同)
  • 我不同意@Lucina的评论。您可能需要调用自定义操作,以在解析参数和复杂操作之间建立无缝映射。我更喜欢让Action对象充当CLI的参数,因此我在CLI itnerface和处理它的对象之间具有多态性。 (2认同)

cfi*_*cfi 5

正如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)
Run Code Online (Sandbox Code Playgroud)

这样您就可以实现所需的行为,而不必添加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"
Run Code Online (Sandbox Code Playgroud)


use*_*294 5

对于在 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
Run Code Online (Sandbox Code Playgroud)

您可能正在寻找的解决方案是传递 action="store_const" 和 const=True

例子:

parser = argparse.ArgumentParser
parser.add_argument('-s', '--start', help='Start script or whatever', action="store_const", const=True)
Run Code Online (Sandbox Code Playgroud)

当 -s 参数传递给 main/脚本的其余部分时,这会将 parser.start 的值设置为“True”。