【发布时间】:2017-01-17 06:09:51
【问题描述】:
我的要求是使用 argparse 实现以下目标:
script.py <command> (-a|--first-name [--middle-name] [--last-name])
所以基本上,脚本会接受一个强制参数,它可以有不同的值。然后是另一个参数,它应该是 -a 或 --first-name。 那么 first-name 可以有更多的参数。
我正在探索子解析器和互斥组,但不知道如何实现这一点
我处理这个问题的一种粗略方式是
parser = argparse.ArgumentParser(prog='myscript', usage='%(prog)s <command> (-a|--first-name [--middle-name] [--last-name])')
parser.add_argument('command')
mxgroup = parser.add_mutually_exclusive_group(required=True)
mxgroup.add_argument('-a', action='store_true', help='Choose all')
mxgroup.add_argument('--first-name', dest='fname')
parser.add_argument('--middle-name', dest='mname')
parser.add_argument('--last-name', dest='lname')
args = parser.parse_args()
if (args.mname or args.lname) and not args.fname:
parser.error('middle and last names may be specified with first name only')
但我在想,如果这些检查可以由 argparse 固有地处理,那么随着脚本的增长,我就不必重做
任何帮助将不胜感激
【问题讨论】:
-
所以你想让用户指定
--middle-name和--last-name仅如果他们还指定--first-name?--middle-name和--last-name之间是否存在依赖关系?或者用户可以只指定名字+姓氏还是名字+中间名? -
中间名和姓氏之间没有依赖关系。但用户必须指定 -a 或 --first-name 以及强制
-
<command>是固定字符串吗?如果是这样,您可以使用add_subparsers并简单地将--first-name指定为子解析器的required=True参数。 -
不固定。它可以取不同的值 -
那是个问题。我认为没有任何方法可以使用内置方法来执行此操作,您必须指定所需的参数,然后手动检查用户是否提供了正确的设置,如果没有手动打印错误并显示帮助消息。