En Wed, 11 Feb 2009 00:31:26 -0200, <mark.sea...@gmail.com> escribió:

I like the ability to access elements of a struct such as with ctypes
Structure:
myStruct.elementName1
4

What I like about it is there are no quotes needed.

What I don't like about it is that it's not iterable:
for n in myStruct:  <== gives error
   print n

I don't want to force the end user to have preknowledge of the element
names.

Note that those names are available as the _fields_ class attribute

Has anyone subclassed ctypes Structure based class to be iterable?
Before a noob starts trying to do this, is it possible?  How to
approach it?

The easiest way would be to define __getitem__ accepting index 0, 1, 2... until the last defined field.
See http://docs.python.org/reference/datamodel.html#object.__getitem__

<code>
from ctypes import Structure

class IterableStructure(Structure):
  def __getitem__(self, i):
    if not isinstance(i, int):
      raise TypeError('subindices must be integers: %r' % i)
    return getattr(self, self._fields_[i][0])

</code>

This was tested as much as you see here:

py> from ctypes import c_int
py>
py> class POINT(IterableStructure):
...     _fields_ = [("x", c_int),
...                 ("y", c_int)]
...
py> point = POINT(10, 20)
py> print point.x, point.y
10 20
py> for field in point:
...   print field
...
10
20
py> print list(point)
[10, 20]

--
Gabriel Genellina

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to