Re: [ctypes-users] Dynamic structures..
Brought to you by:
theller
From: Bob I. <bo...@re...> - 2003-07-30 20:12:34
|
On Wednesday, July 30, 2003, at 2:44PM, John Sutherland wrote: > Ok, I think I have -some- of it figured out... But not all.. > > Here's some example code: > > from ctypes import * > > class TEST(Structure): > _fields_ = [] > > TEST._fields_.append( ( "test1", c_char * 4 ) ) > TEST._fields_.append( ( "test2", c_char * 4 ) ) If you don't know what the fields in a Structure subclass are, simply DON'T DEFINE IT YET :P If you need to create a class on the fly, do this: from ctypes import * MyStructure = type('MyStructure', (Structure,), {'_fields_': [('test1', c_char*4), ('test2', c_char*4)]}) is equivalent to: class MyStructure(Structure): _fields_ = [('test1', c_char*4), ('test2', c_char*4)] Thomas, you should probably make _fields_ a read-only property (via metaclass or whatever), or at least an n-tuple or 2-tuples. When I've written code that did something VERY similar to what Structure does, I had a metaclass that mangled "_fields_", created property descriptors for each member, converted _fields_ to a readonly descriptor (which was a tuple, so you couldn't change it in-line either) that was only useful for introspection purposes anyway since all of the property descriptors had all the information they needed prebound. Essentially, Structure and Union should probably be python classes that just have a superclass of whatever buffer... so long as creating c_char, etc that point to existing memory becomes easy. -bob |