我想在内提出一些与我的程序主要功能有关的参数。但是,我有两个问题:argparse:如何要求一组并非全部相互排斥但不全是可选的参数?
- 不是所有的参数都是互斥的。
- 即使它们全部相互排斥,互斥组 要求参数是可选的,并且主函数
search
(不要求)使用位置参数。
理想情况下,我认为'search'
是主要功能。因此,我希望它的论点成为立场;尽管如此,search
是不需要。但是,至少下列之一是必需的:search, --name, --list, --add, --import, --encrypt, --decrypt, --delete-database, --rename-database, --backup
此外,--name
是不是互相排斥的选项,它是有点多用:
- 如果是由自身调用,它的参数(一个数据库的名字)将被创建,如果它不存在的话。
- 如果(数据库)确实存在,它是用来作为参数传递给任何其他选项的功能调用它用:例如,
-n myfirstdb --decrypt
- 然而,如果
--name
不存在,我认为最近访问的数据库。
目前,我已经运行检查,这已经开始成为一种负担,以查看是否有任何的首要选项已被调用,以测试--name
是否不存在一起。
最后,显然互斥选项不能一起使用。
我怎样才能让search
成为这个必需的互斥组的一部分?我怎样才能让--name
也成为这个必需的群体之一,但是它们中的任何一个都不相互排斥?
我正在尝试使用子分析器,但我不确定它们是否解决了我的问题。任何建议都可能为我节省几天的试验和错误,并且非常感谢。
parser.add_argument(
'search', nargs='*', type=str, metavar='S', help='search [field] for string(s)')
parser.add_argument(
'--name', '-n', type=str, help='name of the database; created if does not exist')
main_ex_group = parser.add_argument_group(
title='main functions').add_mutually_exclusive_group()
main_ex_group.add_argument(
'--list', '-l', action='store_true', help='list databases')
main_ex_group.add_argument(
'--add', '-a', action='store_true', help='add new record to database')
main_ex_group.add_argument(
'--import','-i', dest='include', metavar='PATH', type=str,
help='import file(s) at PATH')
main_ex_group.add_argument(
'--encrypt', action='store_true', help='encrypt database')
main_ex_group.add_argument(
'--decrypt', action='store_true', help='decrypt database')
main_ex_group.add_argument(
'--delete-database', metavar='NAME', type=str,
help='delete a database')
main_ex_group.add_argument(
'--rename-database', nargs=2, metavar='NAME', type=str,
help='rename a database')
main_ex_group.add_argument(
'--backup', nargs=2, metavar='NAME DEST', type=str,
help='copy database to destination')
import_group = parser.add_argument_group(title='options for import')
import_group.add_argument(
'--parse-fields', action='store_true',
help='extract keys/fields from included file(s); used as columns')
import_group.add_argument(
'--delimiter', metavar='S', default='::', help='key-value separator')
没有内置argparse。你只需自己写逻辑 –
谢谢你的简洁明确的答案。 – GH05T