我的要求是使用argparse实现以下功能:
script.py <command> (-a|--first-name [--middle-name] [--last-name])
因此,基本上,脚本将接受一个强制参数,该参数可以具有不同的值。然后是另一个参数,它应该是-a或--firstname。然后名字可以有更多的参数。
我一直在探索子组件和互斥组,但不知道如何实现这个
我处理这件事的一种粗暴方式是
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
(您可能已经看到了(,并针对一组"已经看到"的操作测试组中的每个参数。没有嵌套或复合逻辑测试,只有一个简单、平坦的xor
。
我建议采用('--name', nargs='+', help='name - first [last [middle]]')
类型的论点。也就是说,接受name
的一个或多个字符串。结果将是一个列表,您可以很容易地将其解析为3个部分。它甚至允许用户指定一个由4部分组成的名称,或者一个由10部分组成的贵族名称。
一些侧边栏问题更详细地探讨了这一点,例如
Python argparse互斥组