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

argparse: change argument from positional to optional in certain cases

我的脚本有以下用法:

1
prog.py login password [--show]

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

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

这是我的代码:

1
2
3
4
5
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")

例子:

1
prog.py login=mylogin password=mypassword

这个脚本将myloginmypassword保存到名为authorization.txt的文件中。

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

1
2
login: mylogin
password: mypassword


我在argparse方面的经验有限,所以需要少量的盐,但是这里……

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

此外,argparse不能突发奇想处理对参数结构的更改。在调用parser.parse_args()之前,如何知道传递给它的是什么参数?

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

其思想是两个创建两个可选参数,一次只能调用其中一个参数:

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

这两种方法都是可选的(但我知道)。如果将required标志设置为True,argparse将始终要求在运行prog.py时提供这些参数之一。所以我们真正得到的是一种准可选的位置参数。

注意:您不能向互斥组添加描述/帮助信息…痛一点。

AgPARSE代码:

1
2
3
4
5
6
7
8
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代码:

1
2
3
4
5
$: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的列表。这就不需要任何额外的代码来验证变量的数量,但这并不能防止变量的排序。因为它们存储在一个列表中,所以可以按任意顺序输入…所以小心点。