Python argparse 与可选参数互斥

Python argparse mutually exclusive with optional arguments

我的要求是用 argparse 实现如下:

script.py <command> (-a|--first-name [--middle-name] [--last-name])

基本上,脚本会接受一个强制参数,它可以有不同的值。然后是另一个参数,它应该是 -a 或 --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 固有地处理,那么随着脚本的增长,我将不必重做它

如有任何帮助,我们将不胜感激

解析后测试值一点也不粗鲁。 mutually exclusive group 所做的只是格式化 usage(您可能已经看过),并针对一组 'already-seen' 操作测试组中的每个参数。没有嵌套或复合逻辑测试,只是一个简单的、平面的 xor.

我建议 ('--name', nargs='+', help='name - first [last [middle]]') 一种论点。也就是说,为 name 接受一个或多个字符串。结果将是一个列表,您可以轻松地将其解析为 3 个部分。它甚至允许您用户指定一个由 4 部分组成的名称,或者那些贵族的 10 部分名称之一。

一些边栏问题对此进行了更详细的探讨,例如

Python argparse mutual exclusive group