Python argparse --toggle --no-toggle flag

时间:2016-01-12 04:51:23

标签: python argparse

是否有一种直接的方法可以在Python的argparse中使用--toggle--no-toggle标志?

现在我使用类似以下的内容:

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([])

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

有些相关的答案是Python argparse toggle flags但是我有兴趣使用--no-作为longopts store_false切换前缀(类似于-短信切换前缀概述在前面提到的链接)。

2 个答案:

答案 0 :(得分: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)

然后,如果标志在开头有no,则设置为False:

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

答案 1 :(得分:3)

参数可以使用相同的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参数,否则不会执行任何重要操作。

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