Python argparse --toggle --no-toggle flag

Six*_*Six 3 python argparse

是否有一种简单的方法来使用--toggle--no-toggle使用Python的argparse标记?

现在我正在使用类似于以下内容的东西:

import argparse

parser = argparse.ArgumentParser()

parser.add_argument('--toggle',
                    action='store_true',
                    dest='toggle')
parser.add_argument('--no-toggle',
                    action='store_true',
                    default=True,
                    dest='notoggle')

options = parser.parse_args([])
Run Code Online (Sandbox Code Playgroud)

我只是手动解析long if链中的可能性,但如果有一种方法可以整理它并且状态由解析器立即存储在一个目标中,那将会很好,例如options.toggle.这是可行的,如果可行,怎么样?

一个有点相关的答案是Python argparse切换标志但是我有兴趣使用--no-longopts store_false切换前缀(类似于-前面提到的链接中概述的shortopts切换前缀).

hpa*_*ulj 7

参数可以使用相同的dest

import argparse
parser = argparse.ArgumentParser()

parser.add_argument('--toggle',
                    action='store_const',
                    default = 'unknown',
                    const = 'yes',  # const=True also works
                    dest='toggle')
parser.add_argument('--no-toggle',
                    action='store_const',
                    const = 'no',   # or False
                    dest='toggle')
Run Code Online (Sandbox Code Playgroud)

这产生:

In [60]: parser.parse_args([])    # none
Out[60]: Namespace(toggle='unknown')
In [61]: parser.parse_args(['--tog'])
Out[61]: Namespace(toggle='yes')
In [62]: parser.parse_args(['--no-tog'])
Out[62]: Namespace(toggle='no')
In [63]: parser.parse_args(['--no-tog','--tog'])  # more than one
Out[63]: Namespace(toggle='yes')
Run Code Online (Sandbox Code Playgroud)

我使用了store_const而不是store_trueandstore_false来明确这 3 个选择。 store_true只是store_constconst=Truedefault=False

如果定义 astore_truestore_falsepair,则很难区分无参数 case 和--no-togglecase。 --no-toggle不做任何重要的事情,除非它遵循一个--toggle论点。

如果您需要定义大量这些对,您可以轻松定义一个辅助函数,它接受几个参数,并创建这对参数。


ACh*_*ion 5

为什么不跟你链接的帖子做同样的事情?

import argparse

class NegateAction(argparse.Action):
    def __call__(self, parser, ns, values, option):
        setattr(ns, self.dest, option[2:4] != 'no')

ap = argparse.ArgumentParser()
ap.add_argument('--toggle', '--no-toggle', dest='toggle', action=NegateAction, nargs=0)
Run Code Online (Sandbox Code Playgroud)

然后,如果标志no位于开头,则将其设置为False:

>>> ap.parse_args(['--toggle'])
Namespace(toggle=True)
>>> options = ap.parse_args(['--no-toggle'])
>>> options.toggle
False
Run Code Online (Sandbox Code Playgroud)