是否有一种直接的方法可以在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
切换前缀(类似于-
短信切换前缀概述在前面提到的链接)。
答案 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_true
和store_false
来清除3个替代方案。 store_true
只有store_const
const=True
和default=False
。
如果您定义store_true
和store_false
对,则很难区分无参数情况和--no-toggle
情况。 --no-toggle
除非遵循--toggle
参数,否则不会执行任何重要操作。
如果需要定义一大组这些对,可以轻松定义一个辅助函数,它接受几个参数,并创建一对参数。