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_true
和 store_false
来明确 3 个备选方案。 store_true
只是 store_const
加上 const=True
和 default=False
。
如果定义 store_true
和 store_false
对,则很难区分无参数情况和 --no-toggle
情况。 --no-toggle
没有做任何重要的事情,除非它遵循 --toggle
论点。
如果您需要定义大量这样的对,您可以轻松地定义一个辅助函数,它接受几个参数,并创建一对参数。
是否有直接的方法将 --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_true
和 store_false
来明确 3 个备选方案。 store_true
只是 store_const
加上 const=True
和 default=False
。
如果定义 store_true
和 store_false
对,则很难区分无参数情况和 --no-toggle
情况。 --no-toggle
没有做任何重要的事情,除非它遵循 --toggle
论点。
如果您需要定义大量这样的对,您可以轻松地定义一个辅助函数,它接受几个参数,并创建一对参数。