我的要求是使用argparse来实现以下目标:
script.py <command> (-a|--first-name [--middle-name] [--last-name])
基本上,脚本会接受一个强制参数,它可以有不同的值。然后另一个参数应该是-a或 - first-name。 然后名字可以有更多的参数。
我正在探索subparsers和互斥组,但无法弄清楚如何实现这个
我正在处理的一个粗略方法是
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本身处理,那么随着脚本的增长我就不必重做了
非常感谢任何帮助
答案 0 :(得分:0)
解析后测试值没有什么粗糙之处。 mutually exclusive group
所做的只是格式usage
(您可能已经看过),并根据一组已经看过的&#39;来测试组中的每个参数。动作。没有嵌套或复合逻辑测试,只是一个简单,平坦的xor
。
我建议('--name', nargs='+', help='name - first [last [middle]]')
种论点。也就是说,接受name
的一个或多个字符串。结果将是一个列表,您可以轻松解析为3个部分。它甚至允许用户指定一个4部分名称,或者其中一个贵族10部分名称。
一些侧边栏问题会更详细地探讨这一点,例如