在Python中为类似案例有效使用字典

时间:2014-09-22 18:52:48

标签: python oop dictionary

我在另一个发送和接收许多类似消息的程序中使用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

1 个答案:

答案 0 :(得分:0)

您可以将整数作为参数传递,并在其中包含exec,而不是像observe_volume_0observe_volume_1 ...这样的函数。

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

现在代替你的dict,你可以用这些方法取代dict -

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)那样打电话,或者你甚至可以将两个函数observe_volumetrack_name放在一个类中,并按照here

的说明进行调用