繁体   English   中英

使用argparse中的位置参数作为函数名

[英]Using positional arguments from argparse as function name

我已经使用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()

提前致谢!

听起来动作可能是listadd ,而target可能是domainforwardingtransportuser 是的,如果必须手动列出每个选项组合会执行的操作,则最终会有许多if..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)()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM