选定的选项激活正确的子解析器
Selected options activate right subparsers
我必须以这种方式调用我的脚本。
script.py multiple --ways aa bb -as abab -bs bebe
在这种情况下,-as abab
引用 --ways
参数的 "aa" 选项,-bs bebe
引用 "bb" 选项。
所有选择的选项都会影响将使用的 "fulfill" 方法。
如果我们选择 '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)
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_parser
再到 aa_parser
,后者又处理 '-as abab',生成(我认为)
Namespace(as='abab')
像使用 multiple
和 aa
一样嵌套是使用多个子解析器的唯一方法。您不能有两个子解析 'in-parallel'(例如 'aa' 和 'bb')。
尤其是在测试时,为 add_subparsers
命令提供 dest
是个好主意。它提供有关正在调用哪些子解析器的信息。
我必须以这种方式调用我的脚本。
script.py multiple --ways aa bb -as abab -bs bebe
在这种情况下,-as abab
引用 --ways
参数的 "aa" 选项,-bs bebe
引用 "bb" 选项。
所有选择的选项都会影响将使用的 "fulfill" 方法。 如果我们选择 '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)
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_parser
再到 aa_parser
,后者又处理 '-as abab',生成(我认为)
Namespace(as='abab')
像使用 multiple
和 aa
一样嵌套是使用多个子解析器的唯一方法。您不能有两个子解析 'in-parallel'(例如 'aa' 和 'bb')。
尤其是在测试时,为 add_subparsers
命令提供 dest
是个好主意。它提供有关正在调用哪些子解析器的信息。