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

时间:2016-11-20 21:32:13

标签: python command-line-arguments argparse

我有以下代码段:

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

2 个答案:

答案 0 :(得分:4)

您可以使用parse_known_args实现您的想法。基本上这意味着您可以部分解析args,一次查看是否获得-t,然后再次获取剩余的args。

E.g:

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,但是强大的功能对你的用户负有很大的责任: - )。

答案 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)