Skip to content

Comment on Dynamically create a type with Pythonparent

Comments

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.

See http://www.python.org/download/releases/2.2/descrintro/#meta... for details on metaclasses.

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.

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

Huh, I hadn't thought about that... I may be able to pull that off. Thanks for the suggestion.

AboutSource Built by g1lg1l

Hackerly is an independent reader for Hacker News, built on the public HN API. Not affiliated with Y Combinator.