Python 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

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

欢迎任何建议!

这不是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!")

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放在互斥组中。

没有一个机制要求几个参数一起出现(即没有'互需组')。但是子解析器是沿着这条线工作的。我需要说明在这里如何使用子解析器吗?

Custom Actions类可用于强制参数之间的某种交互,但通常在解析之后更容易实现这类事情。记住argparse允许你以任何顺序给出参数。因此,name的位置可以出现在-c之前,之后,或者在-l-c之间,等等。

最新更新