Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from struct import Struct
- from recordtype import recordtype
- def populate(value, mask):
- mask = mask[-1]
- if value:
- return value
- elif mask in 'bBhHiIlLqQfd':
- return 0
- elif mask in 'sp':
- return ''
- elif mask == '?':
- return False
- def encode(struct):
- encoder = struct._struct
- params = [populate(x, mask) for x, mask in zip(struct, struct._fieldTypes)]
- return encoder.pack(*params)
- def decode(struct, data):
- decoder = struct._struct
- values = decoder.unpack(data)
- for x in zip(struct._fields, values):
- setattr(struct, x[0], x[1])
- def sizeof(struct):
- return struct._struct.size
- def create(name, description):
- description = description.split(',')
- fields = [field[:field.find(':')] for field in description]
- typeList = [field[field.find(':') + 1:] for field in description]
- types = ''.join(['@'] + typeList)
- newType = recordtype(name, fields, default=None)
- newType._struct = Struct(types)
- newType._fieldTypes = typeList
- newType.encode = encode
- newType.decode = decode
- newType.sizeof = sizeof
- return newType
- if __name__ == '__main__':
- Point = create('Point', 'x:f,y:f')
- print Point
- p1 = Point(1, 2)
- p2 = Point(0, 0)
- print p1._asdict().values(), p2
- p2.decode(p1.encode())
- print p2
Add Comment
Please, Sign In to add comment