我有一个处理 TCP 连接的类,当接收到具有给定“ID”的消息时,我需要调用特定的函数来处理它。这些 ID 只是数字,因此我创建了一个 IntEnum 来保存这些 ID:
class ID(IntEnum):
# ...
message_x = 20
message_y = 21
# ...
这些 ID 不一定是连续的(即保留一些 ID),我预计最终会有数百甚至数千个 ID。
因为我不想为每个 ID 创建一千个 if - else,所以我考虑使用 ID 作为字典中的键,该字典包含对处理每条消息的函数的引用:
class ComManager:
def __init__(self):
# Init socket, message queues, threads for sending/receiving etc...
self.rcv_functions = {#...
ID.message_x: ComManager._rcv_message_x,
ID.message_y: ComManager._rcv_message_y,
#...
}
# Launch _rcv_thread here
def _rcv_thread(self):
message_id = self.rcv_message_id() # receive message ID from socket
message_id = ID(message_id) # Change from type "int" to type "ID"
self._rcv_functions[message_id](self) # Call appropriate method according to the dictionary, thus avoiding a massive if/else here or "switch case"-like workarounds
def _rcv_message_x(self):
# Handle reception and processing of message x here
def _rcv_message_y(self):
# Handle reception and processing of message y here
我一直在尝试将“_rcv_functions”放入自己的文件中,因为每条消息都有一个函数已经很烦人了:
# import ID and ComManager classes from their respetive files
_rcv_functions = {
# ...
ID.message_x: ComManager._rcv_message_x,
ID.message_y: ComManager._rcv_message_y,
# ...
}
然后,在 ComManager 中:
class ComManager:
def __init__(self):
# Init socket, message queues, threads for sending/receiving etc...
from x import _rcv_functions
这显然会导致循环依赖。
我一直在寻找这个问题的解决方案,有些人建议使用类型提示,但在这种情况下我无法让它发挥作用。
我还看到一些答案建议对每个字典值使用类似的东西__import__('module_name').ComManager.class_method,但我读到这会严重影响性能,因为每次我调用时都会处理整个文件__import__,这远非理想,因为字典将包含数百个条目。
万千封印
相关分类