问题描述
这可能是一个见解,但由于我大多是自学成才,所以我想征求意见。我有一个输入,然后是一个路由方法,然后是各个方法来处理路由,如下所示:
# Use first char as prefix for routing.
typ_pfx = input[0]
inb_typ_handler(typ_pfx)
#=== Routing ===#
def _inb_typ_handler(self,typ_pfx):
try:
typ_pfx = typ_pfx.upper()
if typ_pfx == 'M':
# Default. Prints to screen.
self._m_handler()
elif typ_pfx == 'C':
# Incoming controller message.
self._c_handler()
elif typ_pfx == 'S':
# Server messages.
self._s_handler()
elif typ_pfx == 'U':
# Misc handler....
self._u_handler()
# ...
# ... omitted for succinctness
# ...
else:
print('Prefix: ',typ_pfx)
print('-x- Unknown message type error.')
except:
pass
#=== Handlers ===#
def _m_handler(self):
"""Standard message. Unpacks message,and prints screen."""
trim_msg = self.unpack_msg(serv_sock)
self.print_message(trim_msg,enc=self.encrypt_traffic)
def _c_handler(self):
"""Control messages from another user. Not displayed."""
self.unpack_msg(serv_sock)
def _s_handler(self):
"""Server announcements."""
msg = self.unpack_msg(serv_sock).decode()
msg = f"@YO: {msg}"
self.print_message(msg,style_name='BLUEGREY')
# ... And so on and so forth.
现在,它们都在主文件的同一个类中(用于套接字客户端)。
我的第一个直觉是将路由器移至模块文件,并将处理程序移至单独的模块文件,然后import
。
因此,将像从socketIO
模块中导入inb_typ_handler一样,然后将这些模块放入自己的处理程序模块中。
我想知道,还有其他方法可以处理它,使其变得更整洁或组织得更好,因为我的处理程序和路由器的数量一直在不断增加,并且目前正处在回滚和滚动时容易丢失的地步
他们使用字母作为前缀代码,但我按功能将它们分组,而不是按字母顺序排列。我听说过@decorators,但从未使用过它们,有什么方法可以应用这些东西来帮助组织处理程序?
我还能做些什么来使代码清晰易读吗?
解决方法
以下是实现我在注释中建议的内容的方法(基于您的示例代码):
class Foobar:
def inb_typ_handler(self,typ_pfx):
handler = self.routing_dict.get(typ_pfx.upper(),type(self)._error_handler)
handler(self,typ_pfx)
def _m_handler(self,typ_pfx):
"""Standard message. Unpacks message,and prints screen."""
print('In _m_handler()')
def _c_handler(self,typ_pfx):
"""Control messages from another user. Not displayed."""
print('In _c_handler()')
def _s_handler(self,typ_pfx):
"""Server announcements."""
print('In _s_handler()')
def _error_handler(self,typ_pfx):
raise RuntimeError(f'Unknown message type error: "{typ_pfx}"')
routing_dict = { # Create method routing table for class.
'M': _m_handler,'C': _c_handler,'S': _s_handler,}
# Sample usage.
foobar = Foobar()
foobar.inb_typ_handler('m')
foobar.inb_typ_handler('s')
foobar.inb_typ_handler('x') # An invalid message type.
以上示例产生的输出:
In _m_handler()
In _s_handler()
Traceback (most recent call last):
File "routing_example.py",line 39,in <module>
foobar.inb_typ_handler('x')
File "routing_example.py",line 9,in inb_typ_handler
handler(self,typ_pfx)
File "routing_example.py",line 24,in _error_handler
raise RuntimeError(f'Unknown message type error: "{typ_pfx}"')
RuntimeError: Unknown message type error: "x"