您要求 argparse 解决方案,但由于您也要求 Pythonic 解决方案,我将特意提出使用包 docopt 的替代方案:
得到它:
$ pip install docopt
将您的代码写入mycommand 文件:
"""
Usage:
mycommand compile [--disable] <zone>...
mycommand launch [--disable] <zone>...
Arguments:
<zone> zone name
Options:
-h --help
--disable disable
"""
from docopt import docopt
if __name__ == "__main__":
args = docopt(__doc__)
print args
然后从命令行调用它:
基本帮助(无参数):
$ python mycommand
Usage:
mycommand compile [--disable] <zone>...
mycommand launch [--disable] <zone>...
寻求帮助:
$ python mycommand -h
Usage:
mycommand compile [--disable] <zone>...
mycommand launch [--disable] <zone>...
Arguments:
<zone> zone name
Options:
-h --help
--disable disable
使用编译子命令:
$ python mycommand compile zoneAlfa zoneBeta
{'--disable': False,
'<zone>': ['zoneAlfa', 'zoneBeta'],
'compile': True,
'launch': False}
添加标志--禁用:
$ python mycommand compile --disable zoneAlfa zoneBeta
{'--disable': True,
'<zone>': ['zoneAlfa', 'zoneBeta'],
'compile': True,
'launch': False}
launch 子命令也可以:
$ python mycommand launch --disable zoneAlfa zoneBeta
{'--disable': True,
'<zone>': ['zoneAlfa', 'zoneBeta'],
'compile': False,
'launch': True}
我对参数解析器的使用也是从 argparse 开始的,我讨厌代码的复杂性,这是做某事所需要的。
后来我变成了plac,这是将python函数转换为非常有用的控制台命令的非常有效的方法。
不过,我还是受限于要遵循和理解的一套规则,在很多情况下,这些规则对我来说不是很清楚。对于docopt,我很感激,我可以先编写文档字符串,遵循 POSIX 的标准规则,然后在我的代码中使用它。如果您关心参数的验证,我将指导您查看这个出色软件包的示例。