我有以下代码段:
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()
关键是,如果指定了x
选项,我不需要位置参数y
,z
和-t
。
答案 0 :(得分:4)
您可以使用parse_known_args
实现您的想法。基本上这意味着您可以部分解析args,一次查看是否获得-t
,然后再次获取剩余的args。
E.g:
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,但是强大的功能对你的用户负有很大的责任: - )。
答案 1 :(得分:2)
根据是否提供了另一个参数,您无法使命名参数可选。你可以为位置参数做到这一点。考虑一下:
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)