我正在从串行端口读取一些二进制数据。每个数据包可以包含由特定字节序列标识的宽数组(几十个左右)消息。为简单起见,让我们假设只有一个再见,以便0x01
对应于第一条消息,依此类推。我希望能够调用一个process
方法来处理每条消息。我可以有一个漫长而乏味的 if 循环,但这会很可怕。Asingledispatch
似乎是一个更好的选择,但每条消息的类似乎 OO 已经完成,并且返回到用于创建这些的巨大 if 循环。
因此,我需要按处理方法的价值进行一次分派bytearray
。
像这样的东西:
from functools import singledispatch
class Ook(object):
def __init__(self, *args, **kwargs):
self.process = singledispatch(self.process)
self.process.register(bytearray([0x01]), self.process_msg_one) # FIXME!
self.process.register(bytearray([0x02]), self.process_msg_two) # FIXME!
def process(self, arg):
raise TypeError("Message is not supported.")
def process_msg_one(self, arg):
print(arg)
def process_msg_two(self, arg):
print(arg)
我很清楚Łukasz Langa 的博客文章,但他的按值分派的实现Enum
用作基类。我真正的Ook
类继承自一个抽象类(所以我可以有一个模拟器而不是真正的硬件)并将它与Enum
raises混合TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its base
......