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