2012-12-31 32 views
1

我已成立了一个脚本argparse这给了我下面的命名空间中的位置参数:从argparse作为函数名

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

我做了这是根据positionals叫了几个功能,并在那一刻我有一个工作情况通过像这样的代码导语美其名曰:

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()

在此先感谢!

+0

会是这样的帮助呢? http://stackoverflow.com/questions/3061/calling-a-function-from-a-string-with-the-functions-name-in-python – favoretti

+0

你可能会对[docopt]感兴趣(https:// github .com/docopt/docopt),它是“为人类辩护”。 –

+0

@favoretti;是的,据我所见,这很像这个问题的公认答案:) @PauloScardine在阅读了很多关于它的文档和大量问题后,我了解了argparse,但是,我陷入了困境关于python代码本身的内部工作^ _^ –

回答

0

这听起来像操作可能是:listadd,而target可能是domainforwardingtransport,或user。是的,如果您不得不手动列出每个选项组合将执行的操作,那么您最终会得到很多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)() 
+0

真棒,这对我来说就像一个魅力,并且也将我的代码削减了一半! :) –