argparse: change argument from positional to optional in certain cases
我的脚本有以下用法:
1 | prog.py login password [--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 |
。
这个脚本将
但是,
1 2 | login: mylogin password: mypassword |
我在argparse方面的经验有限,所以需要少量的盐,但是这里……
始终需要位置参数。如果您的脚本没有明确地要求它们完成它需要做的一切,那么根据定义,它们实际上是可选的。
此外,argparse不能突发奇想处理对参数结构的更改。在调用
考虑到这一点,我认为
其思想是两个创建两个可选参数,一次只能调用其中一个参数:
1 | prog.py --store [login password] --show |
这两种方法都是可选的(但我知道)。如果将
注意:您不能向互斥组添加描述/帮助信息…痛一点。
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']) |
编辑:我最初发布的消息是,
你可以使用