Dynamically create a type with Python
henry.precheur.org
henry.precheur.org
A while back, I created a Struct class, which allows the creation of C-like structs, but you had to create a subclass of Struct, specify the endianness as a class attribute, and create a __format__ method that built the struct members. A little while ago, I had the thought to wrap it into a decorator, defStruct/defStructLE/defStructBE, that automagickly calls 'type' to build the appropriate Struct class for you, given a method.
So what once was:
class Foo(Struct):
__endian__ = Struct.LE
def __format__(self):
self.foo = Struct.uint32
self.bar = Struct.string(self.foo)
Became: @defStructLE
def Foo(self):
self.foo = Struct.uint32
self.bar = Struct.string(self.foo)
Much, much cleaner, all thanks to the magic of 'type'. class Foo(Struct):
__endian__ = Struct.LE
foo = Struct.uint32
bar = Struct.string(foo)
If you don't like specifying the endianness as a class attribute you could still inherit from Struct.LE/BE rather than Struct itself.Quick technical howto: make Struct have a __metaclass__ class attribute, populate the __metaclass__ class with a __new__ or __init__ method performing the desired transformations.
See http://www.python.org/download/releases/2.2/descrintro/#meta... for details on metaclasses.
Couldn't you use a creation counter in a metaclasses and assign order to the attributes as they are added? (like Django's forms use to keep track of field order)
http://code.djangoproject.com/browser/django/trunk/django/fo... creation of the counter on individual fields
http://code.djangoproject.com/browser/django/trunk/django/fo... application of the counter upon field harvesting