为了得到一个相当复杂和大的子命令结构,我正在研究Python的argparse
模块。到目前为止,参数解析进行得很好,一切都很好,但是我正在寻找更好的方法来管理子命令的执行方式。在
下面是我的虚拟/播放应用程序示例:
def a_func(cmd_args):
print(cmd_args)
def b_func(cmd_args):
print(cmd_args)
CMD_DISPATCHER = {
'a': a_func,
'b': b_func
}
def parse_commands():
# Create top-level parser
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(dest='subcmd_name')
# Create parser for the "a" sub-command
parser_a = subparsers.add_parser('a')
parser_a.add_argument('-bar', type=int)
# Create parser for the "b" sub-command
parser_b = subparsers.add_parser('b')
parser_b.add_argument('-foo', type=int)
args = parser.parse_args()
CMD_DISPATCHER[args.subcmd_name](args)
def main():
parse_commands()
if __name__ == '__main__':
main()
如您所见,这里我使用一个简单的dict
(CMD_DISPATCHER
)作为将子命令名与其函数关联的映射。在
正如我所说,这只是我想要实现的一个简单的例子,但是真正的项目将有许多嵌套的子命令,所以我希望有更好的方法来管理这些子命令。在
你知道更好/更专业的方法吗?
好吧,经过更多的研究,我找到了一个适合我需要的好方法:
set_defaults
。我以前使用过这个函数,但总是设置默认的现有参数值。我没有注意到argparse documentation提供的清晰示例:如您所见,
parser_bar.set_defaults(func=bar)
行为parser_bar
参数设置了一个新变量。在本例中,bar
是一个最终用作args.func(args)
行中的子命令执行器的函数。在我希望这对将来的人有帮助。在
相关问题 更多 >
编程相关推荐