如果存在可选参数,则不需要所有位置参数
Don't require all the positional arguments if an optional argument is present
我有以下片段:
parser = argparse.ArgumentParser()
parser.add_argument("a") # always required
parser.add_argument("x") # don't required in case -t option is chosen
parser.add_argument("y") # don't required in case -t option is chosen
parser.add_argument("z") # don't required in case -t option is chosen
parser.add_argument("-t", "--tt")
args = parser.parse_args()
关键是,如果指定了 -t
选项,我不需要位置参数 x
、y
和 z
。
您不能根据是否提供另一个参数将命名参数设为可选。不过,您可以为位置参数执行此操作。考虑一下:
parser = argparse.ArgumentParser()
parser.add_argument("a") # always required
parser.add_argument("-t", "--tt", nargs=3) # Expects 3 arguments if -t
args = parser.parse_args()
if args.tt:
x, y, z = args.tt
print(x, y ,z)
你可以使用 parse_known_args
实现我认为的目标。基本上这意味着您可以部分解析 args,一次查看是否获得 -t
,然后再次获得剩余的 args。
例如:
test.py
import argparse
parser1 = argparse.ArgumentParser()
parser1.add_argument("a") # always required
parser1.add_argument("-t", "--tt", default=False, action='store_true')
args1 = parser1.parse_known_args()
if args1[0].tt:
print('got t')
else:
parser2 = argparse.ArgumentParser()
parser2.add_argument("x")
parser2.add_argument("y")
parser2.add_argument("z")
args2 = parser2.parse_args(args1[1])
print('got all args')
称之为:
$ python test.py a -t
got t
$ python test.py a
usage: test.py [-h] x y z
test.py: error: too few arguments
$ python test.py a b c d
got all args
您可能想要修改 usage
字符串,以确保您得到一些理智的东西。像这样,您可以构建非常强大的 CLI,但强大的功能会给您的用户带来巨大的责任:-)。
我有以下片段:
parser = argparse.ArgumentParser()
parser.add_argument("a") # always required
parser.add_argument("x") # don't required in case -t option is chosen
parser.add_argument("y") # don't required in case -t option is chosen
parser.add_argument("z") # don't required in case -t option is chosen
parser.add_argument("-t", "--tt")
args = parser.parse_args()
关键是,如果指定了 -t
选项,我不需要位置参数 x
、y
和 z
。
您不能根据是否提供另一个参数将命名参数设为可选。不过,您可以为位置参数执行此操作。考虑一下:
parser = argparse.ArgumentParser()
parser.add_argument("a") # always required
parser.add_argument("-t", "--tt", nargs=3) # Expects 3 arguments if -t
args = parser.parse_args()
if args.tt:
x, y, z = args.tt
print(x, y ,z)
你可以使用 parse_known_args
实现我认为的目标。基本上这意味着您可以部分解析 args,一次查看是否获得 -t
,然后再次获得剩余的 args。
例如:
test.py
import argparse
parser1 = argparse.ArgumentParser()
parser1.add_argument("a") # always required
parser1.add_argument("-t", "--tt", default=False, action='store_true')
args1 = parser1.parse_known_args()
if args1[0].tt:
print('got t')
else:
parser2 = argparse.ArgumentParser()
parser2.add_argument("x")
parser2.add_argument("y")
parser2.add_argument("z")
args2 = parser2.parse_args(args1[1])
print('got all args')
称之为:
$ python test.py a -t
got t
$ python test.py a
usage: test.py [-h] x y z
test.py: error: too few arguments
$ python test.py a b c d
got all args
您可能想要修改 usage
字符串,以确保您得到一些理智的东西。像这样,您可以构建非常强大的 CLI,但强大的功能会给您的用户带来巨大的责任:-)。