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

我对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 ,则在运行prog.py时,argparse将始终要求提供其中一个参数。 所以我们真正得到的是某种准选择性的立场论点。

注意:您不能将描述/帮助信息添加到互斥组合中......痛苦的一点。

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的列表。这不需要任何额外的验证代码的变量数量,但是,这并不能防止变量的排序。 由于它们存储在列表中,因此可以按任意顺序输入......所以要小心。

链接地址: http://www.djcxy.com/p/28561.html

上一篇: argparse: change argument from positional to optional in certain cases

下一篇: Argparse: Required arguments listed under "optional arguments"?