我的程序应该包括以下选项,由 argparse 正确解析:
- 可选参数:
[-h, --help]
和[-v, --version]
- 互斥参数:
[-f FILE, --file FILE]
和[-u 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点和第4点实现到我的代码中?
编辑:
我尝试了-f
和-u
作为子解析器,如这里所描述的那样,但子命令似乎像位置参数一样被处理,如果我不使用参数运行它,则解析器会给出一个error: too few arguments
。
-
开头,例如"-f a -F -u"
(这里的格式是"-u")。(https://gist.github.com/zed/b94e3e9945debe25826d) - jfsdocopt
看起来很不错,我会深入研究并报告它是否符合我的需求。 - rypel