1

我已经使用 argparse 设置了一个脚本,它为我提供了以下命名空间:

Namespace(action='list', input='all', target='domain')

我已经制作了一些根据位置调用的函数,目前我有一个工作情况,方法是用这样的代码简介来调用它们:

if args.action == 'list':
    if len(sys.argv) == 2:
        parser.print_help()
        sys.exit(0)
elif args.target == 'domain':
    domain_list()
elif args.target == 'forwarding':
    forwarding_list()
elif args.target == 'transport':
    transport_list()
elif args.target == 'user':
    user_list()
else:
    all_list()

我知道这可以做到,比这更好;但由于我对 Python 的了解有限,我似乎无法弄清楚这一点。

回顾:如果可能的话,我想要类似的东西(伪代码)

if args.action == 'add':
    target = args.target
    target_add()

target_add()类似的东西在哪里domain_add()

提前致谢!

4

1 回答 1

0

听起来 action 可能是listor add,而target可能是domain, forwarding, transport, or userif..then..else是的,如果您必须手动列出每个选项组合的作用,您最终会得到很多代码。

这是一种简化的方法:

  • 使用 itertools.product 生成所有可能的选项组合。
  • 使用白名单调度字典将选项映射到函数。键是 2 元组,例如('domain','list')、 或('transport','add')。这些值是关联的函数对象。

import itertools as IT

targets = 'domain forwarding transport user'.split()
actions = 'list add'.split()

dispatch = {key:globals()['%s_%s' % key] for key in IT.product(targets, actions)}

# This calls the function specified by (target, action).
# The `dict.get` method is used so that if the key is not in `dispatch`, the `all_list` function is called.
dispatch.get((args.target, args.action), all_list)()
于 2012-12-31T13:28:46.623 回答