Python argparse --toggle --no-toggle 标志

Python argparse --toggle --no-toggle flag

是否有直接的方法将 --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([])

我只是手动解析长 if 链中的可能性,但如果有一种方法可以整理它并让解析器立即将状态存储在一个目的地,那就太好了,例如options.toggle。这可行吗?如果可行,怎么做?

一个有点相关的答案是 Python argparse toggle flags 但是我有兴趣使用 --no- 作为 longopts store_false 切换前缀(类似于概述的 - shortopts 切换前缀在前面提到的 link).

为什么不像你链接到的 post 一样呢??

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)

那么如果flag开头有no就设置为False:

>>> ap.parse_args(['--toggle'])
Namespace(toggle=True)
>>> options = ap.parse_args(['--no-toggle'])
>>> options.toggle
False

参数可以使用相同的 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')

这会产生:

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')

我使用 store_const 而不是 store_truestore_false 来明确 3 个备选方案。 store_true 只是 store_const 加上 const=Truedefault=False

如果定义 store_truestore_false 对,则很难区分无参数情况和 --no-toggle 情况。 --no-toggle 没有做任何重要的事情,除非它遵循 --toggle 论点。

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