Python argparse与可选参数

时间:2016-09-09 07:04:49

标签: python argparse

我的要求是使用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本身处理,那么随着脚本的增长我就不必重做了

非常感谢任何帮助

1 个答案:

答案 0 :(得分:0)

解析后测试值没有什么粗糙之处。 mutually exclusive group所做的只是格式usage(您可能已经看过),并根据一组已经看过的&#39;来测试组中的每个参数。动作。没有嵌套或复合逻辑测试,只是一个简单,平坦的xor

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

一些侧边栏问题会更详细地探讨这一点,例如

Python argparse mutual exclusive group