如果存在可选参数,则不需要所有位置参数

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 选项,我不需要位置参数 xyz

您不能根据是否提供另一个参数将命名参数设为可选。不过,您可以为位置参数执行此操作。考虑一下:

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,但强大的功能会给您的用户带来巨大的责任:-)。