我在另一个发送和接收许多类似消息的程序中使用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 :(得分:0)
您可以将整数作为参数传递,并在其中包含exec,而不是像observe_volume_0
,observe_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_volume
和track_name
放在一个类中,并按照here