import struct from collections import namedtuple class Struct(object): def __init__(self, typename, *lst, **kwds): expected_size = kwds.pop('expected_size', None) if kwds: raise TypeError, 'unexpected keyword arguments: %s' % (kwds.keys()) names = [name for name, fmt in lst if name] self.T = namedtuple(typename, names) fmts = [fmt for name, fmt in lst] fmt = ''.join(fmts) self.struct = struct.Struct(fmt) self.size = self.struct.size if expected_size is not None: assert self.size == expected_size def unpack(self, s): return self.T(*self.struct.unpack(s)) def pack(self, tup): return self.struct.pack(*tup)