Python Argparse:当且仅当给出一个标志时,如何使参数成为必需?

时间:2016-10-19 00:55:50

标签: python python-3.x arguments argparse

我想知道如何在给出一个标志时需要一个参数,并且在没有给出该标志时是可选的?

import argparse


parser = argparse.ArgumentParser()

parser.add_argument('-c', '--convert', action = 'store_true')
parser.add_argument('-l', '--lookup', action = 'store_true')
parser.add_argument('name', type = str) 

args = parser.parse_args()

if args.name:
    print(args.name)
if args.convert:
    print ("convert now!")

例如,在上面的代码中,我只需要name时才需要-c。当我仅使用-l运行程序时,会出现错误:

$ python3 test.py -l
usage: test.py [-h] [-c] [-l] name
test.py: error: the following arguments are required: name

我尝试使用参数组将参数分为两组1. -cname; 2. -l,但它并没有真正发挥作用。

任何建议都表示赞赏!

2 个答案:

答案 0 :(得分:2)

这不是argparse可以自行执行的。您可以做的是将name定义为可选,然后在解析后检查您的约束是否满足。

import argparse


parser = argparse.ArgumentParser()

parser.add_argument('-c', '--convert', action='store_true')
parser.add_argument('-l', '--lookup', action='store_true')
parser.add_argument('name', nargs='?') 

args = parser.parse_args()

# If args.name must be a non-empty string when given,
# you can use 'not args.name' in place of 'args.name is None'
if args.convert and args.name is None:
    parser.error("<name> required with --convert")

if args.name:
    print(args.name)
if args.convert:
    print ("convert now!")

答案 1 :(得分:1)

argparse中没有任何内容可以直接执行此操作;但它可以用各种方式近似

parser.add_argument('-c', '--convert', action = 'store_true')
parser.add_argument('-l', '--lookup', action = 'store_true')
parser.add_argument('name', nargs='?', default='good default') 

在任何一种情况下都不需要,但在-c的情况下,您可以使用good default,也可以在解析后投诉。

parser.add_argument('-c', '--convert')
parser.add_argument('-l', '--lookup', nargs='?', default='adefault', const='aconst')

在这种情况下,-c需要一个参数,即您所需的name-l的参数是可选的。如果没有-l,则值为default;如果-l没有参数,则值为const。您甚至可以将-c-l放在互斥的群组中。

没有一种机制可以要求多个参数一起使用(即没有“相互需要的组”)。然而,subparsers沿着那条线工作。我是否需要说明如何在这里使用subparser?

自定义操作类可用于强制参数之间的某种交互,但通常在解析后更容易实现这种事情。请记住argparse允许您以任何顺序提供参数。因此,name位置可能发生在-c之前,或之后,或-l-c之间等。