用Python在稀疏数组中存储函数
我有一个相对较大的枚举,其中每个成员代表一种消息类型。客户端将收到一条消息,其中包含与枚举中的msg类型关联的整数值。对于每种msg类型,都会有一个单独的函数回调来处理msg 我希望通过使用一个稀疏数组(或向量),使回调的查找和调度尽可能快,其中枚举值映射到回调的索引。在Python中,如果数组不能保存函数类型,这是否可能用Python在稀疏数组中存储函数,python,sparse-array,Python,Sparse Array,我有一个相对较大的枚举,其中每个成员代表一种消息类型。客户端将收到一条消息,其中包含与枚举中的msg类型关联的整数值。对于每种msg类型,都会有一个单独的函数回调来处理msg 我希望通过使用一个稀疏数组(或向量),使回调的查找和调度尽可能快,其中枚举值映射到回调的索引。在Python中,如果数组不能保存函数类型,这是否可能 #pseudo code for 'enum' class MsgType(object): LOGIN, LOGOUT, HEARTBEAT, ... = rang
#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),这使它们成为完美的候选。谢谢
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)
它不是严格需要的,但我为消息ID添加了一个子类int
。这样,您可以检查ID值是否真的是ID值,而不仅仅是某个随机整数
我假设每条消息中都有一个ID值,标识它是什么类型的消息,以及一些数据。msg_func
字典使用MsgID
值作为键,映射到函数引用
你可以把所有函数放在一个类中,但我在这里没有这样做;它们只是函数。1。数组(我猜你指的是元组或列表)可以容纳函数。2.使用
dict
。@DavidHeffernan在这两点上都完全正确。Python数组可以保存函数引用,您应该使用dict
来解决这个问题。@DavidHeffernan我认为您应该给出答案。@Lattyware您对Python的了解远比我多,我相信您可以编写比我好得多的答案。作为参考,您永远不应该忽略O(1)这样的关键细节从一个问题进入!感谢steveha,我很感谢您的回复,不过我特别想弄清楚如何将函数存储在一个可以用整数值索引的容器中。您为什么要这样做?这样做你想解决什么问题?请注意,您始终可以构建函数引用的列表
,也可以使用相同的函数引用构建一个dict
,因此您所要求的很容易实现。但我不明白重点。哦,你担心访问速度。在Python中,dict()
非常快;几乎在需要某种稀疏数据结构的任何时候,dict
都是一个很好的解决方案。