argparse:在某些情况下将参数从position更改为optional

时间:2017-08-04 06:13:05

标签: python python-3.x argparse

我的脚本有以下用法:

prog.py login password [--show]

loginpassword是位置参数。但是,如果指定了另一个参数(-s--show),我想将它们转换为可选项。因此,用法将是:

prog.py --show [login] [password]

这是我的代码:

parser = argparse.ArgumentParser(...)
parser.add_argument('login', help="User login")
parser.add_argument('password', help="User password")
parser.add_argument('-s', '--show', dest='show', action='store_true',
                    help="Show user login and password")

示例:

prog.py login=mylogin password=mypassword

此脚本将myloginmypassword保存到名为authorization.txt

的文件中

但是,prog.py --show只应从authorization.txt检索信息,而不需要loginpassword参数,并将当前用户登录名和密码打印到stdout:

login: mylogin
password: mypassword

1 个答案:

答案 0 :(得分:3)

我对argparse的经验有限,所以需要少量的盐,但这里有......

位置参数始终是必需的。如果您的脚本没有明确要求它完成它需要做的所有事情,那么根据定义,它们实际上是可选的。

此外,argparse无法随心所欲地处理对参数结构的更改。在调用parser.parse_args()之前,如何知道传递给它的参数是什么?

考虑到这一点,我认为add_mutually_exclusive_group()是您可能需要的https://docs.python.org/2/library/argparse.html#mutual-exclusion

这个想法是两个创建两个可选参数,其中只有一个可以在任何时候被调用:

prog.py --store [login password] --show

这些都是无法选择的(但是,我知道)。如果将required标志设置为True,则argparse将始终要求在运行prog.py时显示其中一个参数。所以我们真正获得的是某种准可选位置论证。

N.B。您不能将描述/帮助信息添加到互斥组中......有点痛苦。

argparse代码:

parser = argparse.ArgumentParser()
exclusive_group = parser.add_mutually_exclusive_group(required=True)
exclusive_group.add_argument('--store', dest='store', nargs=2, type=str,
                                 help="Store user login and password")
exclusive_group.add_argument('--show', dest='show', action='store_true',
                                 help="Show user login and password")
args = parser.parse_args()
print(args)

运行argparse代码:

$:python test.py --show
Namespace(show=True, store=None)

$:python test.py --store foo bar
Namespace(show=False, store=['foo', 'bar'])

修改 我最初发布nargs不允许使用整数值来定义允许的变量数,但感谢@hpaulj进行更正。

您可以使用nargs=2,这意味着必须为--store提供2个参数,如果未获得2,则会提供错误。因此,目标store是长度为2的列表这无需任何额外的代码来验证变量的数量,但这并不能防止变量的排序。由于它们存储在列表中,因此可以按任何顺序输入......所以要小心。