Python 2.7 argparse:如何正确嵌套可选的互斥参数?
我的程序应包括以下选项,并由以下人员正确解析:Python 2.7 argparse:如何正确嵌套可选的互斥参数?,python,python-2.7,command-line-arguments,argparse,Python,Python 2.7,Command Line Arguments,Argparse,我的程序应包括以下选项,并由以下人员正确解析: 纯可选:[-h,--help]和[-v,--version] 相互排斥:[-f文件,--FILE文件]和[-u URL,--URL URL URL] 如果选择了--url,则为可选:[-V,--verbose] 如果选择了--file或--url,则需要:[-F,--format format] 理想的使用模式是: prog.py [-h] [-v] [-f FILE (-F FORMAT) | -u URL [-V] (-F FORMAT) ]
[-h,--help]
和[-v,--version]
[-f文件,--FILE文件]
和[-u URL,--URL URL URL]
--url
,则为可选:[-V,--verbose]
--file
或--url
,则需要:[-F,--format format]
prog.py [-h] [-v] [-f FILE (-F FORMAT) | -u URL [-V] (-F FORMAT) ]
-F
要求适用于互斥组的两个成员。我不确定这是否是一场灾难 因此,应该可以运行:
prog.py -u "http://foo.bar" -V -F csv
解析器尖叫着,以防我忘记了-F
(他应该这么做的)
到目前为止我所做的:
parser = ArgumentParser(decription='foo')
group = parser.add_mutually_exclusive_group()
group.add_argument('-f','--file', nargs=1, type=str, help='')
group.add_argument('-u','--url', nargs=1, type=str, help='')
parser.add_argument('-V','--verbose', action='store_true', default=False, help='')
parser.add_argument('-F','--format', nargs=1, type=str, help='')
因为它有一个“普通模式”可以在没有命令行参数的情况下运行,所以所有参数都必须是可选的
如何实施第3点。四,。输入我的代码
编辑:如前所述,我尝试将
-f
和-u
作为子parser,但子命令似乎被视为位置命令,解析器给了我一个错误:如果我在没有参数的情况下运行它,参数太少了。当存在某个选项时,可以使用方法在optparse
中强制执行这些点
但是,在argparse
中,这些选项不可用
您可以为url
和file
子选项添加一个,并分别解析它们。
从帮助中:
请注意,parse_args()返回的对象将只包含
命令行选择的主解析器和子解析器
(而不是任何其他子帕斯)。因此,在上面的示例中,当
如果指定,则仅存在foo和bar属性,并且当
如果指定,则仅存在foo和baz属性
但是我只想正确地记录用法,忽略那些不正确的参数
适用
e、 g.让这两个命令行的行为完全相同:
prog.py -f FILE -V
prog.py -f FILE
使用nargs=2和tuple metavar接近您的目标
parser = argparse.ArgumentParser(prog='PROG')
group = parser.add_mutually_exclusive_group()
group.add_argument('-f','--file', nargs=2, metavar=('FILE','FORMAT'))
group.add_argument('-u','--url', nargs=2, metavar=('URL','FORMAT'))
parser.add_argument('-V','--verbose', action='store_true',help='optional with url')
产生:
usage: PROG [-h] [-f FILE FORMAT | -u URL FORMAT] [-V]
optional arguments:
-h, --help show this help message and exit
-f FILE FORMAT, --file FILE FORMAT
-u URL FORMAT, --url URL FORMAT
-V, --verbose optional with url
这需要文件名或url的格式,只是不需要-F
。如其他人所述,在-f
情况下可以忽略-V
我尝试将-f和-u作为子parser,如下所述,但是子命令似乎被视为位置命令,解析器给了我一个错误:如果我在没有参数的情况下运行它,那么参数太少
在最新版本中,子命令不再视为必需的位置。据我所知,这是将错误消息更改为更具信息性的一个副作用。代替\u parse\u known\u args
执行以下操作:
if positionals:
self.error(_('too few arguments'))
它扫描\u操作
,查看需要哪些操作,然后在错误消息中按名称列出这些操作。这将在中讨论。我知道这个变化正在发展中(3.4),也可能在3.3中
你考虑过吗?缺点是它允许选项值以-
开头,是否需要-f
和-u
中的一个?如果是这样,我正在描绘一个包含子命令或位置参数的解决方案。@chepner:不,它们不是。我希望该程序也运行没有参数和选项,所以它将启动一个用户对话框,甚至GUI@J.F.Sebastian:docopt
看起来不错,我会深入研究并报告它是否适合我的需要argparse
内置了对参数数量可变的选项的支持,以及处理参数的自定义操作一个给定的选项。但是,我同意在这种情况下,最简单的方法是只允许使用-V
,如果使用-f
,则忽略它。optpasse
被弃用,而argparse
则被替换。见: