在argparse中,如何使位置参数依赖于可选参数



如何使位置参数依赖于可选参数?

例如:

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()

上面的代码所做的是:

  1. 创建argparse.ArgumentParser
  2. 添加名为commandsubparser
  3. 然后我们创建4个parsers(每个操作一个(,我们可以向其添加参数
  4. 最后,我们将func设置为run_command,我们将其传递给解析器和参数

最新更新