分派Python的argparse子命令的最佳方式

2024-04-24 15:35:00 发布

您现在位置:Python中文网/ 问答频道 /正文

为了得到一个相当复杂和大的子命令结构,我正在研究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()

如您所见,这里我使用一个简单的dictCMD_DISPATCHER)作为将子命令名与其函数关联的映射。在

正如我所说,这只是我想要实现的一个简单的例子,但是真正的项目将有许多嵌套的子命令,所以我希望有更好的方法来管理这些子命令。在

你知道更好/更专业的方法吗?


Tags: 方法name命令cmdaddparserparsemain
1条回答
网友
1楼 · 发布于 2024-04-24 15:35:00

好吧,经过更多的研究,我找到了一个适合我需要的好方法:set_defaults。我以前使用过这个函数,但总是设置默认的现有参数值。我没有注意到argparse documentation提供的清晰示例:

>>> # sub-command functions
>>> def foo(args):
...     print(args.x * args.y)
...
>>> def bar(args):
...     print('((%s))' % args.z)
...
>>> # create the top-level parser
>>> parser = argparse.ArgumentParser()
>>> subparsers = parser.add_subparsers()
>>>
>>> # create the parser for the "foo" command
>>> parser_foo = subparsers.add_parser('foo')
>>> parser_foo.add_argument('-x', type=int, default=1)
>>> parser_foo.add_argument('y', type=float)
>>> parser_foo.set_defaults(func=foo)
>>>
>>> # create the parser for the "bar" command
>>> parser_bar = subparsers.add_parser('bar')
>>> parser_bar.add_argument('z')
>>> parser_bar.set_defaults(func=bar)
>>>
>>> # parse the args and call whatever function was selected
>>> args = parser.parse_args('foo 1 -x 2'.split())
>>> args.func(args)
2.0
>>>
>>> # parse the args and call whatever function was selected
>>> args = parser.parse_args('bar XYZYX'.split())
>>> args.func(args)
((XYZYX))

如您所见,parser_bar.set_defaults(func=bar)行为parser_bar参数设置了一个新变量。在本例中,bar是一个最终用作args.func(args)行中的子命令执行器的函数。在

我希望这对将来的人有帮助。在

相关问题 更多 >