2014-09-22 79 views
-1

我在另一個發送和接收許多類似消息的程序中使用Python。本質上,程序發送一個「地址」和「值」。爲了儘可能簡潔,我製作了一本詞典作爲開關/案例聲明。但是,在我進入代碼之前,我想確保我正在編寫最高效的代碼。在Python中對類似案例的字典的高效使用

許多消息非常相似(只有最後一位數字不同),我想知道是否有某種方式可以連接observe_volume_(digit)個案。可能會有數百條消息被告知,並且將每條消息添加到字典中似乎有點荒謬,因爲消息已經變得很長,並且有六條消息。

def observe_volume_0(v): 
    op('constant4').par.value0 = float(v[0]) 

def observe_volume_1(v): 
    op('constant4').par.value1 = float(v[0]) 

def observe_volume_2(v): 
    op('constant4').par.value2 = float(v[0]) 

def track_0_name(v): 
    op('text1').par.text = v[0] 
    print(v[0]) 

def track_1_name(v): 
    op('text1').par.text = v[0] 
    print(v[0]) 

def track_2_name(v): 
    op('text1').par.text = v[0] 
    print(v[0]) 


incoming = { 
    '/track_0_name/x': track_0_name, 
    '/track_1_name/x': track_1_name, 
    '/track_2_name/x': track_2_name, 
    '/observe_volume_0/x': observe_volume_0, 
    '/observe_volume_1/x': observe_volume_1, 
    '/observe_volume_2/x': observe_volume_2, 
} 

def receive(message, args): 
full = message.split() 
target = full[0] 
incoming[target](args) 
return 

回答

0

而不必大量的功能,如observe_volume_0observe_volume_1的......,你可以傳遞整數作爲參數,並有一個exec裏面喜歡 -

def observe_volume(num, v): 
    exec("op('constant4').par.value" + str(num) + " = float(v[0])") 

def track_name(num, v): 
    exec("op('text1').par.text = v[0]") 
    print(v[0]) 

現在代替你快譯通,你可以有方法這樣的替換字典 -

import re 
l = lambda x: 'track_name' if x.startswith("/track") else 'observe_volume' 
number = lambda x : re.findall(r'\d+', x)[0] 
target = '/observe_volume_0/x' 
function_name = l(target) 
num = number(target) 

現在你可以調用像 - locals()[function_name](num, args)或者你可能甚至p使用observe_volumetrack_name這兩個功能,並按照解釋的方式呼叫here

相關問題