2011-08-26 108 views
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:]) 

但是我應該如何處理它,當我需要以下形式的參數送入回調? (I具有對SQL控制,這將產生Optparse輸入字符串)

  • ACTION_NAME:的空間分隔的字符串。 (例如:'TEST ACTION'

  • 主機組:字符串

  • actions_holder:由包括列表:

    • condition_type(字符串)
    • condition_operator(字符串)
    • condition_filter(空格分隔字符串)

  • operations_holder:由包括列表:
    • operation_type:(字符串)
    • 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('" "') 

其作品的那種,但有更完美的方式來獲得這些參數?

回答

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

+1

真正歡迎發現。將很好地適合代碼。剛讀完文檔,主要是因爲我被迫使用Python2.4,因此我將使用這個配方http://code.activestate.com/recipes/500261-named-tuples/作爲namedtuple實現。 –

+0

+1提到如何使此解決方案向後兼容! Valeu! – Remi

+0

呵呵。我是這個接近給你+1瞭解巴西葡萄牙語:) –

1

我不確定這是否是你想要的,但在我看來,你可以使用argparse並使用nargs參數來指定應該消耗多少個參數。

你可能已經知道了,但這裏有一個鏈接:使用nargs=+nargs=*會把你的參數列表上http://docs.python.org/dev/library/argparse.html#nargs

。所以,你的例子,我想你可以打電話給你的程序,如:關於這裏使用namedtuple

--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"' 
+0

由於弗雷德分裂。 我意識到它,但試圖避免安裝在這臺服務器上(這是一個RHEL5,所以使用Python 2.4)。無論如何感謝您的解釋 –