我正在从串口读取一些二进制数据。每个数据包可以包含由特定字节序列标识的宽阵列(几十个)。为简单起见,让我们假设只有一个再见,以便0x01
对应第一条消息,依此类推。我希望能够调用process
方法来处理每条消息。我可以有一个漫长而乏味的if循环,但这将是可怕的。 singledispatch
似乎是一个更好的选项,但每个消息的类似乎已经完成,并且回到创建它们的巨大的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's blog post,但他按值分派的实现使用Enum
作为基类。我真正的Ook
类继承自抽象类(因此我可以使用模拟器而不是真实硬件)并将其与Enum
混合TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its base
...