[英]Setting options from environment variables to positional arguments when using 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()
。
提前致谢!
听起来动作可能是list
或add
,而target
可能是domain
, forwarding
, transport
或user
。 是的,如果必须手动列出每个选项组合会执行的操作,则最终会有许多if..then..else
代码。
这是一种简化方法:
('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.