Python Argparse:当且仅当给出一个标志时如何使参数成为必需的?
Python Argparse: how to make an argument required if and only if one flag is given?
我想知道如何在给出一个标志时使一个参数成为必需的,而在没有给出该标志时如何使一个参数成为可选的?
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!")
例如,在上面的代码中,我希望仅在给出 -c
时才需要 name
。当我运行程序只带-l
时,出现错误:
$ python3 test.py -l
usage: test.py [-h] [-c] [-l] name
test.py: error: the following arguments are required: name
我尝试使用参数组将参数分为两组 1. -c
和 name
; 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
放在一个互斥的组中。
没有要求多个参数一起出现的机制(即没有“相互要求的组”)。然而,子解析器沿着这条线工作。我需要在这里说明如何使用子解析器吗?
自定义操作类 可用于在参数之间强制进行某种交互,但通常在解析后更容易实现此类操作。请记住 argparse
允许您以任何顺序给出参数。因此 name
位置可能出现在 -c
之前,或之后,或在 -l
和 -c
之间等
我想知道如何在给出一个标志时使一个参数成为必需的,而在没有给出该标志时如何使一个参数成为可选的?
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!")
例如,在上面的代码中,我希望仅在给出 -c
时才需要 name
。当我运行程序只带-l
时,出现错误:
$ python3 test.py -l
usage: test.py [-h] [-c] [-l] name
test.py: error: the following arguments are required: name
我尝试使用参数组将参数分为两组 1. -c
和 name
; 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
放在一个互斥的组中。
没有要求多个参数一起出现的机制(即没有“相互要求的组”)。然而,子解析器沿着这条线工作。我需要在这里说明如何使用子解析器吗?
自定义操作类 可用于在参数之间强制进行某种交互,但通常在解析后更容易实现此类操作。请记住 argparse
允许您以任何顺序给出参数。因此 name
位置可能出现在 -c
之前,或之后,或在 -l
和 -c
之间等