到目前为止,我通过Optparse处理多个参数作为字符串, 例如:
--update_entities="host_group hostname entity_type entities2monitor"
其中,entities2monitor具有可变参数,通过回调函数抓取它们(注意[3:]
),
host = value.split()
(host_group, hostname, entity_type, entities2monitor) = (host[0], host[1], host[2], host[3:])
但是当我需要将以下形式的参数提供给回调时,我该如何处理? (我可以控制将生成Optparse输入字符串的SQL)
action_name:以空格分隔的字符串。 (例如:'TEST ACTION'
)
hostgroup:一个字符串
actions_holder:包含以下内容的列表:
和
示例:
--create_action='''TEST ACTION | client_service_platform | "CONDITION_TYPE_TRIGGER_NAME CONDITION_OPERATOR_LIKE Weighted Successful" "CONDITION_TYPE_HOST CONDITION_OPERATOR_EQUAL host01" | "OPERATION_TYPE_MESSAGE userid1" "OPERATION_TYPE_EMAIL userid1" "OPERATION_TYPE_EMAIL userid2"'''
这是我到目前为止所拥有的,
actions_splits = actions_parameters.split(" | ")
action_name = actions_splits[0]
hostgroup = actions_splits[1]
actions_holder = actions_splits[2].strip('"').split('" "')
operations_holder = actions_splits[3].strip('"').split('" "')
哪种方式有效,但是有更无缝的方式来获取这些参数吗?
答案 0 :(得分:1)
我不确定这是否是你想要的,但在我看来你可以使用argparse并使用nargs
参数来指定应该消耗多少个参数。
您可能已经知道了,但这里有一个链接:http://docs.python.org/dev/library/argparse.html#nargs
使用nargs=+
或nargs=*
会将您的参数放在列表中。因此,在您的示例中,我认为您可以将您的程序称为:
--create_action "TEST ACTION" client_service_platform \
'"CONDITION_TYPE_TRIGGER_NAME CONDITION_OPERATOR_LIKE Weighted Successful"\
"CONDITION_TYPE_HOST CONDITION_OPERATOR_EQUAL tt1scp1"'\
'"OPERATION_TYPE_MESSAGE userid1" "OPERATION_TYPE_EMAIL userid1"\
"OPERATION_TYPE_EMAIL userid2"'
答案 1 :(得分:1)
在这里使用namedtuple怎么样:
import collections
Action = collections.namedtuple('Action', 'name hostgroup actions operations')
使用;
和,
来区分命令组件:
command= "TEST ACTION;client_service_platform;CONDITION_TYPE_TRIGGER_NAME CONDITION_OPERATOR_LIKE Weighted Successful,CONDITION_TYPE_HOST CONDITION_OPERATOR_EQUAL tt1scp1; OPERATION_TYPE_MESSAGE userid1,OPERATION_TYPE_EMAIL userid1,OPERATION_TYPE_EMAIL userid2"
现在实例化:
a = Action(*command.split(';'))
允许您致电:
a.name
a.hostgroup
a.actions.split(',')
a.operations.split(',')
然后可以使用.split()