I'm trying to do protocol decoding in Python.
Short version of my question:
I have received an array of bytes that is a packet of data.
- Using the first byte of the packet, I know what type of packet it is.
- Using that - I want to construct a packet via a class.
When i want to send a packet, really need to reuse about 90% of the processing done in the same packet class so that I can construct and send a packet.
I can do one of the above, I can't seem to do both
For example - something like this:
class PacketType123(BasePacketType):
def __init__fromparams( self, field1, field2 ):
# called when you want to send a packet
# ... initialize like I'am sending the packet
self.field1 = field1
self.field2 = field2
def encode_and_send(self,destination):
# encode into raw byte
databytes = self.encode()
destination.send( databytes )
# called when a packet is received on the wire
def __init__frombytearray( self, bytearray ):
self.decode_bytearray( bytearray )
print("Hi Field2 = %d" % self.field2 )
# create packet decode lookup table.
lookuptable = dict()
# populate it with classes
lookuptable[123] = PacketType123
# other packets would added to the lookup table
lookuptable[44] = PacketType44
lookuptable[12] = PacketType12
To send
p1 = PacketType1( 42, "dogs and cats" )
p1.encode_and_send( server )
To process incomming data, do this:
databytes = receive_message()
packet = lookuptable[ datbytes[0] ].__init__frombytearray(databytes)
My problem is I can do either the ToSend or the ProcessIncomming, I don't know how to do both with the same class.
I've looked over:
- May __init__ be used as normal method for initialization, not as constructor?
- Multiple constructors in python?
What is a clean, pythonic way to have multiple constructors in Python?
I've seen this but I'm confused by it: https://hg.python.org/cpython/file/3.5/Lib/multiprocessing/heap.py#l223
It seems the only way to make this work is with keyword args.. Yuck that complicates other things for me... Looking for other way of doing this.
Suggestions please?