繁体   English   中英

Python 2.7 argparse:如何正确嵌套可选的mutally独占参数?

[英]Python 2.7 argparse: How to nest optional mutally exclusive arguments properly?

我的程序应包括以下选项,由argparse正确解析:

  1. 纯粹是可选的: [-h, --help][-v, --version]
  2. 互斥: [-f FILE, --file FILE][-u URL, --url URL]
  3. 如果选择了--url则可选: [-V, --verbose]
  4. 如果选择了--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='')

由于它具有在没有命令行参数的情况下运行的“vanilla模式”,因此所有参数都必须是可选的。

如何在我的代码中实现第3点和第4点?

编辑:
我试图-f-u的subparsers,如所描述这里 ,但子看起来positionals要处理和解析器给了我一个error: too few arguments ,如果我不带参数运行它。

使用nargs = 2和元组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作为subparsers,如此处所述,但是子命令似乎被视为位置,并且解析器给我一个错误:如果我在没有参数的情况下运行它,则参数太少。

在最新版本中,子命令不再被视为必需的位置。 据我所知,这是更改错误消息的副作用,以提供更多信息。 而不是_parse_known_args做一个:

    if positionals:
        self.error(_('too few arguments'))

它扫描_actions以查看哪些是必需的,然后在错误消息中按名称列出它们。 这在http://bugs.python.org/issue9253中讨论。 我知道这个变化正在开发中(3.4),也可能在3.3中。


当存在某个选项时,可以使用回调方法在optparse中强制执行这些点。

但是,在argparse这些都不可用。

您可以为urlfile子选项添加subparser ,并单独解析这些子选项。 从帮助:

请注意,parse_args()返回的对象将只包含主解析器和命令行(而不是任何其他子分析器)选择的子解析器的属性。 因此,在上面的示例中,当指定a命令时,仅存在foo和bar属性,并且当指定b命令时,仅存在foo和baz属性。

但我只是正确记录用法,并忽略不适用的参数。

例如,让这两个命令行表现完全相同:

prog.py -f FILE -V
prog.py -f FILE

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM