2012-06-13 3 views
0

각 모듈은 메시지 유형을 나타내는 비교적 큰 열거 형을 사용합니다. 클라이언트는 열거 형의 msg 유형과 연관된 정수 값을 포함하는 메시지를 수신합니다. 각 msg 유형에 대해 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)로되어있어 완벽한 후보가된다는 것을 이해합니다. 감사.

+5

1. 배열 (튜플 또는 목록을 의미하는 것 같군요)은 함수를 포함 할 수 있습니다. 2.'dict'을 사용하십시오. –

+0

@DavidHeffernan은 두 지점에서 정확히 맞습니다. 파이썬 배열은 함수 참조를 저장할 수 있으므로이 문제를 해결하기 위해'dict'을 사용해야합니다. – steveha

+0

@DavidHeffernan 당신은 대답으로 대답해야한다고 생각합니다. –

답변

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) 

그것은 엄격하게 필요하지만 메시지 ID에 대한 int의 서브 클래스를 추가 아니에요. 그렇게하면 ID 값이 실제로 임의의 정수가 아닌 ID 값인지 확인할 수 있습니다.

각 메시지의 ID 값이 메시지의 종류와 일부 데이터를 나타내는 것으로 가정합니다. msg_func 사전은 MsgID 값을 키로 사용하며 함수 참조에 매핑됩니다.

클래스 안에 모든 함수를 넣을 수는 있지만 여기서는 수행하지 않았습니다. 그들은 단지 함수입니다.

+0

감사합니다 steveha,하지만 나는 특별히 응답 정수 값으로 인덱싱 할 수있는 컨테이너 함수를 저장하는 방법을 찾으려고 노력하고 응답을 주셔서 감사합니다. – Graeme

+0

왜이 작업을 수행 하시겠습니까? 이 문제로 어떤 문제를 해결하려고합니까? 함수 참조의'list'를 만들 수 있고, 같은 함수 참조로'dict'을 만들 수 있습니다. 그래서 당신이 원하는 것은 쉽게 가능합니다. 그러나 나는 그 요점을 보지 못한다. – steveha

+0

오, 액세스 속도가 걱정되었습니다. 'dict()'는 파이썬에서 매우 빠릅니다. 'dict'은 거의 언제든지 일종의 희소 데이터 구조를 원할 때 좋은 해결책입니다. – steveha

관련 문제