Python - элегантно обрабатывать последовательность нескольких аргументов - PullRequest
1 голос
/ 26 августа 2011

До сих пор я обрабатывал несколько аргументов через 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:])

Но как мне подходить к этому, когда мне нужно передать параметры следующей формы в обратный вызов? (У меня есть контроль над SQL, который будет генерировать строку ввода Optparse)

  • имя_ действия: строка с пробелом. (Например: 'TEST ACTION')

  • группа хостов: строка

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

какие виды работ, но есть ли более простой способ получить эти параметры?

Ответы [ 2 ]

1 голос
/ 26 августа 2011

как насчет использования именованного кортежа здесь:

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

1 голос
/ 26 августа 2011

Я не уверен, что это то, что вам нужно, но мне кажется, что вы можете использовать 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"'
...