1

これまで、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')

  • ホストグループ:文字列

  • actions_holder:以下で構成されるリスト:

    • condition_type (文字列)
    • 条件演算子 (文字列)
    • 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

ここで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(',')

最後の2つの要素は、次のように再び分割できます.split()

于 2011-08-26T19:19:07.537 に答える
1

これがあなたが望むものかどうかはわかりませんが、 argparse を使用し、nargs引数を使用して消費する引数の数を指定できるように思えます。

すでにご存知かもしれませんが、ここにリンクがあります: http://docs.python.org/dev/library/argparse.html#nargs

nargs=+orを使用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"'
于 2011-08-26T18:41:26.637 に答える