1

到目前为止,我正在通过 Optparse 将多个参数作为字符串处理,例如:

--update_entities="host_group hostname entity_type entities2monitor"

其中 entity2monitor 具有可变参数,通过(注意[3:])在回调函数中获取它们,

host = value.split()
(host_group, hostname, entity_type, entities2monitor) = (host[0], host[1], host[2], host[3:])

但是当我需要将以下形式的参数提供给回调时,我应该如何处理它?(我可以控制将生成 Optparse 输入字符串的 SQL)

  • action_name:空格分隔的字符串。(例如'TEST ACTION':)

  • 主机组:一个字符串

  • actions_holder:由以下组成的列表:

    • 条件类型(字符串)
    • 条件运算符(字符串)
    • condition_filter(空格分隔的字符串)

  • Operations_holder:由以下组成的列表:
    • 操作类型:(字符串)
    • operation_sendto:(字符串)

例子:

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

哪种方法有效,但有没有更无缝的方法来获取这些参数?

4

2 回答 2

1

我不确定这是否是您想要的,但在我看来,您可以使用 argparse 并使用nargs参数来指定应该使用多少个参数。

你可能已经知道了,但这里有一个链接:http ://docs.python.org/dev/library/argparse.html#nargs

使用nargs=+ornargs=*将你的论点放在一个列表中。因此,对于您的示例,我认为您可以将程序称为:

--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"'
于 2011-08-26T18:41:26.637 回答
1

在这里使用命名元组怎么样:

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

于 2011-08-26T19:19:07.537 回答