在Python中对类似情况有效地使用字典

2024-04-24 20:11:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我在另一个程序中使用Python来发送和接收许多类似的消息。本质上,程序发送一个“地址”和一个“值”。为了尽可能简洁,我制作了一本字典来充当switch/case语句。然而,在我深入研究我的代码之前,我想确保我正在编写最有效的代码。你知道吗

许多消息非常相似(只有最后一个数字不同),我想知道是否有某种方法可以连接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

Tags: textname程序消息字典deftrackfloat
1条回答
网友
1楼 · 发布于 2024-04-24 20:11:52

你不需要像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])

现在你可以用这样的方法代替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

相关问题 更多 >