argparse:从位置到可选在某些情况下改变参数

问题描述:

我的脚本具有以下用法: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应该只能检索无需loginpassword参数并打印当前用户的登录名和密码从authorization.txt信息到stdout:

login: mylogin 
password: mypassword 
+0

为您的用例提供示例可帮助我们更好地理解您的问题。 –

+0

在你的代码中'-s'和'--show'做同样的事情,把'args.dest'属性设置为'True'。这两个都不改变所需的两个位置的解析。 – hpaulj

+0

处理这个问题的最简单方法是使参数始终为可选,然后检查'show'参数值是否设置为false,如果是,检查是否提供了用于登录名和密码的vlaue并且适当地抛出错误? –

我有限的与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将始终要求提供其中一个参数。所以我们真的得到是某种准可选位置的论点。

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

+2

你可以使用'nargs = 2'。 – hpaulj

+1

@hpaulj啊!我一直试图以'nargs ='2''的方式来做......这样做更有意义。编辑答案。 – dijksterhuis