选定的选项可激活正确的次级解析器

时间:2018-07-09 10:19:08

标签: python python-3.x argparse

我必须以这种方式调用我的脚本。 script.py multiple --ways aa bb -as abab -bs bebe 在这种情况下,-as abab--ways参数返回到“ aa”选项,而从-bs bebe到“ bb”选项。

所有选择的选项都将影响将使用的“完成”方法。 如果我们选择“ aa”和“ bb”,则应该只有选项“ -as”和“ -bs”,而不是“ -cs”。

import sys
from argparse import ArgumentParser

def fulfill_aa_parser(aa_parser):
    aa_parser.add_argument('--ass', '-as', type=str, required=True, choices=['abababa'])

def fulfill_bb_parser(aa_parser):
    aa_parser.add_argument('--bass', '-bs', type=str, required=True, choices=['bebebe'])

def fulfill_cc_parser(aa_parser):
    aa_parser.add_argument('--cass', '-cs', type=str, required=True, choices=['cycycyc'])

def fulfill_multiple_parser(multiple_parser):
    multiple_parser.add_argument('--ways', '-w', type=str, choices=['aa','bb', 'cc'], nargs='+', required=True)

def main(argv):
    parser = ArgumentParser(description='TEST CASE')
    subparsers = parser.add_subparsers(dest='type')

    multiple_parser = subparsers.add_parser(
        'multiple'
    )
    aabbparsers = multiple_parser.add_subparsers()
    aa_parser = aabbparsers.add_parser('aa')
    bb_parser = aabbparsers.add_parser('bb')
    cc_parser = aabbparsers.add_parser('cc')
    fulfill_multiple_parser(multiple_parser)
    fulfill_aa_parser(aa_parser)
    fulfill_bb_parser(bb_parser)
    fulfill_cc_parser(cc_parser)
    args = parser.parse_args(argv)
    if args.type is None:
        parser.print_help()
        return

if __name__ == '__main__':
    main(sys.argv[1:])

以这种方式解析:

    fulfill_aa_parser(multiple_parser)
    fulfill_bb_parser(multiple_parser)
    fulfill_cc_parser(multiple_parser)

将导致解析器始终要求'-as','-bs','-cs'和'--ways'中的选项不会对此造成影响

编辑:\ 这是经过深思熟虑后得出的结果。 只需将解析器传递给此函数

def fulfill_apple_argparser(parser):
    parser.add_argument("--apple_argument")

def fulfill_banana_argparser(parser):
    parser.add_argument("--banana_argument")

def fulfill_peach_argparser(parser):
    parser.add_argument("--peach_argument")

def many_fruits_parse(parser, progs=None, list_of_fruits=('apple', 'banana', 'peach')):
    progs = progs or []
    if len(list_of_fruits) == 0 or parser in progs:
        return
    fulfill = {'apple': fulfill_apple_argparser, 'banana': fulfill_banana_argparser,
               'peach': fulfill_peach_argparser}
    subparsers = parser.add_subparsers(title='subparser', dest=parser.prog)
    progs.append(parser)
    for fruit in list_of_fruits:
        secondary = [x for x in list_of_fruits if x != fruit]
        fruit_parser = subparsers.add_parser(fruit, help=fruit)
        fulfill[fruit](fruit_parser)
        many_fruits_parse(fruit_parser, progs, secondary)

1 个答案:

答案 0 :(得分:0)

add_subparsers创建一种特殊的positional参数,该参数使用add_parser命令创建choices。提供有效选择后,解析将传递到该parser

使用

script.py multiple --ways aa bb -as abab -bs bebe

parser将任务传递给multiple_parser--ways可选项然后获得2个值

Namespace(ways=['aa','bb'])

这两个字符串都不用作aabbparsers的值,并且multiple_parser不知道如何处理'-as`或'-bs',并且(我希望)会提高错误。

使用:

script.py multiple aa -as abab

解析从parser传递到multiple_parseraa_parser,依次处理“ -as abab”,产生(我认为)

Namespace(as='abab')

使用multipleaa进行嵌套是使用多个子解析器的唯一方法。您不能有两个“平行”的子项(例如,“ aa”和“ bb”)。

尤其是在测试时,最好为dest命令提供add_subparsers。它提供有关正在调用哪些子解析器的信息。