0

我有一个相对较大的枚举,其中每个成员代表一个消息类型。客户端将收到一条消息,其中包含与枚举中的 msg 类型关联的整数值。对于每种味精类型,都会有一个单独的函数回调来处理味精。

我想通过使用枚举值映射到回调索引的稀疏数组(或向量)来尽可能快地查找和调度回调。在给定数组不能保存函数类型的 Python 中,这可能吗?

#pseudo code for 'enum'
class MsgType(object):
    LOGIN, LOGOUT, HEARTBEAT, ... = range(n)

#handler class
class Handler(object):
    def handleMsg(self, msg):
        #dispatch msg to specific handler

    def __onLogin(self, msg):
        #handle login

    def __onLogout(self, msg):
        #handle logout

更新: 我的术语不清楚。我现在理解 Python 字典查找的复杂度为 O(1),这使它们成为完美的候选者。谢谢。

4

1 回答 1

2
class MsgID(int):
    pass

LOGIN = MsgID(0)
LOGOUT = MsgID(1)
HEARTBEAT = MsgID(2)
... # add all other message identifier numbers

class MsgType(object):
    def __init__(self, id, data):
        self.id = id
        self.data = data


def login_handler(msg):
    ...  # do something here

def logout_handler(msg):
    ...  # do something here

def heartbeat_handler(msg):
    ...  # do something here


msg_func = {
    LOGIN  : login_handler,
    LOGOUT : logout_handler,
    HEARTBEAT : heartbeat_handler,
    ...
}


class Handler(object):
    def handleMsg(self, msg):
        try:
            msg_func[msg.id](msg)  # lookup function reference in dict, call function
        except KeyError:
            log_error_mesg('message without a handler function: %d' % msg.id)

它不是严格需要的,但我添加了一个int消息 ID 的子类。这样您就可以检查 ID 值是否真的是一个 ID 值,而不仅仅是一些随机整数。

我假设每条消息都会有一个 ID 值,标识它是什么类型的消息,以及一些数据。msg_func字典使用值MsgID作为键,映射到函数引用。

您可以将所有函数放在一个类中,但我在这里没有这样做;它们只是功能。

于 2012-06-13T19:32:08.920 回答