如何使位置参数依赖于可选参数?
例如:
parser.add_argument("-A", action="store_true", help = "add")
parser.add_argument("-U", action="store_true", help = "update")
parser.add_argument("-D", action="store_true", help = "delete")
parser.add_argument("-L", action="store_true", help = "list")
如果我选择-A,我希望它需要参数";名称、地址、cp号";
但如果我选择-L,我不希望它需要任何东西,或者当我选择-U时,它需要另一组参数。
我的最终目标是创建一个联系人簿,在其中我可以添加新联系人、更新现有联系人、删除联系人和列出联系人。如果我使用if-else语句,我可以做到这一点,但我想尝试使用argparse。
如果我使用argparse不正确,请给我一些建议!
这是使用subparsers
:的好机会
这(我认为(颠覆了你想要实现的目标。
帮助文本如下所示:
😊 /tmp python3 test.py --help
usage: PROG [-h] {add,update,delete,list} ...
positional arguments:
{add,update,delete,list}
Sub-commands
add ADD help text
update UPDATE help text
delete DELETE help text
list LIST help text
optional arguments:
-h, --help show this help message and exit
See '<command> --help' to read about a specific sub-command.
😊 /tmp python3 test.py add -h
usage: PROG add [-h] [--foo FOO]
optional arguments:
-h, --help show this help message and exit
--foo FOO
这个骨架应该让你开始:
import argparse
def run_command(parser, args):
if args.command == 'add':
print(args)
elif args.command == 'update':
print(args)
elif args.command == 'delete':
print(args)
elif args.command == 'list':
print(args)
parser = argparse.ArgumentParser(
prog='PROG',
epilog="See '<command> --help' to read about a specific sub-command."
)
subparsers = parser.add_subparsers(dest='command', help='Sub-commands')
add_parser = subparsers.add_parser('add', help='ADD help text')
add_parser.add_argument("--foo")
add_parser.set_defaults(func=run_command)
update_parser = subparsers.add_parser('update', help='UPDATE help text')
update_parser.add_argument('--bar')
update_parser.set_defaults(func=run_command)
delete_parser = subparsers.add_parser('delete', help='DELETE help text')
delete_parser.add_argument('--baz')
delete_parser.set_defaults(func=run_command)
list_parser = subparsers.add_parser('list', help='LIST help text')
list_parser.add_argument('--qux')
list_parser.set_defaults(func=run_command)
args = parser.parse_args()
if args.command is not None:
args.func(parser, args)
else:
parser.print_help()
上面的代码所做的是:
- 创建
argparse.ArgumentParser
- 添加名为
command
的subparser
- 然后我们创建4个
parsers
(每个操作一个(,我们可以向其添加参数 - 最后,我们将
func
设置为run_command
,我们将其传递给解析器和参数