python-优雅地处理多个参数的序列

python-优雅地处理多个参数的序列,python,command-line-arguments,optparse,Python,Command Line Arguments,Optparse,到目前为止,我通过optpass作为字符串处理多个参数, 例如: 如果entities2monitor有变量参数,则通过(注意[3://code>)在回调函数中获取它们 但是,当我需要将以下形式的参数输入回调时,我应该如何处理它呢? (我可以控制将生成optpass输入字符串的SQL) 操作\u名称:以空格分隔的字符串。(例如:“测试操作”) 主机组:字符串 行动\u持有人:由以下内容组成的列表: 条件类型(字符串) 条件_运算符(字符串) 条件过滤器(以空格分隔的字符串) 及 操作\

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

如果entities2monitor有变量参数,则通过(注意
[3://code>)在回调函数中获取它们

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

  • 操作\u名称:以空格分隔的字符串。(例如:
    “测试操作”

  • 主机组:字符串

  • 行动\u持有人:由以下内容组成的列表:

    • 条件类型(字符串)
    • 条件_运算符(字符串)
    • 条件过滤器(以空格分隔的字符串)

  • 操作\u持有人:由以下内容组成的列表:
    • 操作类型:(字符串)
    • 操作_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('" "')

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

我不确定这是否是您想要的,但在我看来,您可以使用argparse并使用
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"'

在这里使用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()

再次拆分,谢谢。我知道这一点,但试图避免在这个服务器上安装它(它是RHEL5,所以使用Python 2.4)。无论如何,谢谢你的解释,我真的很欢迎你的发现。将非常适合于代码。我刚刚看完文档,主要是因为我被迫使用Python2.4,这里我将使用这个配方来实现namedtuple。+1用于说明如何使这个解决方案向后兼容!瓦鲁!呵呵。我差一点就给你+1,因为你懂巴西利亚葡萄牙语:)
a = Action(*command.split(';'))
a.name
a.hostgroup
a.actions.split(',')
a.operations.split(',')