I'd rather utilize a metaclass in this special case. This would retain the notion of Foo being a type much better than transmogrifying a function into a class. (Granted, there's not that big a difference technically but you're tricking other programmers into believing Foo cannot be used for eg. isinstance.)
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.
Metaclasses won't fly in this case, since the order of struct members has to be kept. Tried a bunch of things to make it work, but in the end nothing came out cleaner.
"Metaclasses won't fly in this case, since the order of struct members has to be kept."
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)
Oh, I didn't think about the order. Django's approach to this issue is really simple and only requires that all your Struct fields are instances of some common base class.
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.