我正在构建一个包含多个subparser的软件,我想那些具有不同convert_arg_line_to_args
定义的软件,所以我所做的就是考虑选择的subparser来替换我的解析器的功能:
parser = ArgumentParser(fromfile_prefix_chars='@')
subparsers = parser.add_subparsers(title='Available sub commands')
sub_parser = subparsers.add_parser("sub1", help="sub1")
sub_parser.add_argument("--paramsub1", required=True, dest="paramsub1")
sub_parser.set_defaults(cmd_object="sub1")
sub_parser = subparsers.add_parser("sub2", help="sub2")
sub_parser.add_argument("--paramsub2", required=True, dest="paramsub2")
sub_parser.set_defaults(cmd_object="sub2")
我想argparse不检查参数,但告诉我选择了哪个subparser:
args = vars(parser.parse_args())
if args["cmd_object"] == "sub1": parser.convert_arg_line_to_args = function1
elif args["cmd_object"] == "sub2": parser.convert_arg_line_to_args = function2
args = vars(parser.parse_args())
有什么想法吗?
答案 0 :(得分:1)
您是否要检查子分析器名称,以便设置convert_arg_line_to_args
功能?相反,您可以在设置期间更改该功能。
这个设置怎么样?
def function1(arg_line):
print('function1: %r'%arg_line)
return [arg_line]
def function2(arg_line):
print('function2: %r'%arg_line)
return arg_line.split()
parser = ArgumentParser()
subparsers = parser.add_subparsers(title='Available sub commands', dest='cmd_object')
sub_parser1 = subparsers.add_parser("sub1", help="sub1",fromfile_prefix_chars='@')
sub_parser1.convert_arg_line_to_args = function1
sub_parser1.add_argument("--paramsub1")
sub_parser2 = subparsers.add_parser("sub2", help="sub2",fromfile_prefix_chars='@')
sub_parser2.convert_arg_line_to_args = function2
sub_parser2.add_argument("--paramsub2")
我将fromfile_prefix_chars='@'
从解析器移到了子分析器。这样解析器就不会尝试读取参数文件。
通常需要的参数定义为positional
(不含--
)。
使用dest='cmd_object'
将subparser名称放入命名空间。 sest_defaults
也有效,但是当你想将该值设置为函数(或其他非字符串)时更有用。