Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python argparse:在某些情况下,将参数从位置参数更改为可选参数_Python_Python 3.x_Argparse - Fatal编程技术网

Python argparse:在某些情况下,将参数从位置参数更改为可选参数

Python argparse:在某些情况下,将参数从位置参数更改为可选参数,python,python-3.x,argparse,Python,Python 3.x,Argparse,我的脚本有以下用法: prog.py login password [--show] login和password是位置参数。但是,如果指定了另一个参数(-s或--show),我想将它们转换为可选参数。因此,用法将是: prog.py --show [login] [password] 这是我的代码: parser = argparse.ArgumentParser(...) parser.add_argument('login', help="User login") parser.add

我的脚本有以下用法:

prog.py login password [--show]
login
password
是位置参数。但是,如果指定了另一个参数(
-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
此脚本将
mylogin
mypassword
保存到名为
authorization.txt的文件中

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

login: mylogin
password: mypassword

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

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

此外,argparse无法一时兴起处理参数结构的更改。在调用
parser.parse_args()
之前,它如何知道传递给它的参数是什么

考虑到这一点,我认为您可能需要
添加互斥组()

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

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)
$:python test.py --show
Namespace(show=True, store=None)

$:python test.py --store foo bar
Namespace(show=False, store=['foo', 'bar'])
运行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)
$: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,则会提供一个错误。因此,目的地
存储
是长度为2的列表。这就不需要任何额外的代码来验证变量的数量,但是,这并不能防止变量的排序。由于它们存储在列表中,因此可以按任何顺序输入。。。所以要小心。

为您的用例提供示例将帮助我们更好地理解您的问题。在您的代码
-s
-show
中,执行相同的操作,将
args.dest
属性设置为
True
。两者都不会更改对2个必需位置的解析。处理此问题的最简单方法不是使参数始终可选,然后检查“show”参数值是否设置为false,如果设置为false,则检查是否提供了登录名和密码符,并相应地抛出错误?您可以使用
nargs=2
@hpaulj ah!我一直试着像
nargs='2'
那样做。。。这更有意义。编辑答案。