Re: Iterable Ctypes Struct
En Thu, 12 Feb 2009 00:02:12 -0200, escribió: On Feb 11, 5:51 pm, Marc 'BlackJack' Rintsch wrote: On Wed, 11 Feb 2009 17:33:23 -0800, mark.seagoe wrote: > Not sure what generic attribute container is. I am reading in from > xml file all reg names for a chip. Are you using instances of that class to interface C code or to read/ write data intended to be read or written by a C program? If not then `ctypes` might be the wrong tool. It's accessing through USB so I'm also interfacing to Win32 drivers. But at this higher level, since I'm somewhat new to Python so I'm not aware of other classes which exist to allow accessing in the format desired (without quotes and using dot notation): classname.elementname1, instead of something like classname ["elementname1"]. It's just cosmetic, but I'd prefer the dot notation without quotes for the end user experience of script writing later. Is there something besides ctypes.Structure that would do that? You don't need *anything* special to add attributes to an object in Python. Even an empty class is enough: py> class Struct(object): ... pass # an empty class ... py> s = Struct() py> s.x = 10 py> s.y = 20 py> print s.x, s.y 10 20 py> But since this thread started asking how to iterate over the attributes, let's use a named tuple: py> from collections import namedtuple py> StructWithNames = namedtuple("StructWithNames", "x,y,z") py> s = StructWithNames(10, 20, 30) py> s.z 30 py> s StructWithNames(x=10, y=20, z=30) py> list(s) [10, 20, 30] py> for item in s: print item ... 10 20 30 py> s._fields ('x', 'y', 'z') -- Gabriel Genellina -- http://mail.python.org/mailman/listinfo/python-list
Re: Iterable Ctypes Struct
On Feb 11, 5:51 pm, Marc 'BlackJack' Rintsch wrote: > On Wed, 11 Feb 2009 17:33:23 -0800, mark.seagoe wrote: > > Not sure what generic attribute container is. I am reading in from xml > > file all reg names for a chip. > > Are you using instances of that class to interface C code or to read/ > write data intended to be read or written by a C program? If not then > `ctypes` might be the wrong tool. > > Ciao, > Marc 'BlackJack' Rintsch It's accessing through USB so I'm also interfacing to Win32 drivers. But at this higher level, since I'm somewhat new to Python so I'm not aware of other classes which exist to allow accessing in the format desired (without quotes and using dot notation): classname.elementname1, instead of something like classname ["elementname1"]. It's just cosmetic, but I'd prefer the dot notation without quotes for the end user experience of script writing later. Is there something besides ctypes.Structure that would do that? Thx, Mark -- http://mail.python.org/mailman/listinfo/python-list
Re: Iterable Ctypes Struct
On Wed, 11 Feb 2009 17:33:23 -0800, mark.seagoe wrote: > Not sure what generic attribute container is. I am reading in from xml > file all reg names for a chip. Are you using instances of that class to interface C code or to read/ write data intended to be read or written by a C program? If not then `ctypes` might be the wrong tool. Ciao, Marc 'BlackJack' Rintsch -- http://mail.python.org/mailman/listinfo/python-list
Re: Iterable Ctypes Struct
Hi Gabriel; Not sure what generic attribute container is. I am reading in from xml file all reg names for a chip. So then I'd be able to use python scripts to access the regs. So eventually this class will get subclassed w/ hw access instead of just saving in int. So I want to call this module something like "CHIP" which contains a struct. I add the "REG" struct objects as I read them in from xml file. The "REG" struct would have info about address, # of bits, type (RO, RW, etc). Thx, Mark -- http://mail.python.org/mailman/listinfo/python-list
Re: Iterable Ctypes Struct
En Wed, 11 Feb 2009 16:32:41 -0200, escribió: On Feb 11, 9:01 am, mark.sea...@gmail.com wrote: On Feb 10, 9:52 pm, "Gabriel Genellina" wrote: > En Wed, 11 Feb 2009 00:31:26 -0200, escribió: > > I like the ability to access elements of a struct such as with > > ctypes > > Structure: > > What I don't like about it is that it's not iterable: > > I don't want to force the end user to have preknowledge of the > > element > > names. [recipe using _fields_] Thanks very much, Gabriel. This is very good start for me. This works for predefined class. How about a situation where the fields are added dynamically (as from reading in from an xml file). I tinkered with it and think I have viable solution. I need to append a new member to _fields_ before writing it, then it seems to work. p._fields_.append(('z', c_int)) point.z = 30 print 'List:', list(p) List: [10, 20, 30] Yes, that's the way to add a new field -- but you have to do that before creating the first instance. Anywy, this is somewhat strange for a ctypes Structure. Usually its memory layout is fixed and mandated by the library/format/whatever you're trying to bind to. You are not using it as a generic attribute container, are you? There are better alternatives in that case. -- Gabriel Genellina -- http://mail.python.org/mailman/listinfo/python-list
Re: Iterable Ctypes Struct
In last post, I mixed code w/ 'p' and 'point'. Should be: >>> point._fields_.append(('z', c_int)) >>> point.z = 30 >>> print 'List:', list(point) List: [10, 20, 30] -- http://mail.python.org/mailman/listinfo/python-list
Re: Iterable Ctypes Struct
On Feb 11, 9:01 am, mark.sea...@gmail.com wrote: > On Feb 10, 9:52 pm, "Gabriel Genellina" > wrote: > > > > > > > En Wed, 11 Feb 2009 00:31:26 -0200, 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. > > Seehttp://docs.python.org/reference/datamodel.html#object.__getitem__ > > > > > 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]) > > > > > > 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 > > Thanks very much, Gabriel. This is very good start for me. > This works for predefined class. How about a situation where the > fields are added dynamically (as from reading in from an xml file). > For example, if I were to now add another element: > > >>> point.z = 30 > >>> print list(point) > [10, 20] > >>> dir(point) > > ['__class__', '__ctypes_from_outparam__', '__delattr__', '__ > dict__', '__doc__', '__getattribute__', '__getitem__', '__ha > sh__', '__init__', '__module__', '__new__', '__reduce__', '_ > _reduce_ex__', '__repr__', '__setattr__', '__str__', '__weak > ref__', '_b_base_', '_b_needsfree_', '_fields_', '_objects', > 'x', 'y', 'z'] > > I don't know why the iterator (where ever it is) didn't get > incremented. Thanks for any insight. > > Mark- Hide quoted text - > > - Show quoted text - I tinkered with it and think I have viable solution. I need to append a new member to _fields_ before writing it, then it seems to work. >>> p._fields_.append(('z', c_int)) >>> point.z = 30 >>> print 'List:', list(p) List: [10, 20, 30] Awesome. Thanks! -- http://mail.python.org/mailman/listinfo/python-list
Re: Iterable Ctypes Struct
On Feb 10, 9:52 pm, "Gabriel Genellina" wrote: > En Wed, 11 Feb 2009 00:31:26 -0200, 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. > Seehttp://docs.python.org/reference/datamodel.html#object.__getitem__ > > > 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]) > > > > 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 Thanks very much, Gabriel. This is very good start for me. This works for predefined class. How about a situation where the fields are added dynamically (as from reading in from an xml file). For example, if I were to now add another element: >>> point.z = 30 >>> print list(point) [10, 20] >>> dir(point) ['__class__', '__ctypes_from_outparam__', '__delattr__', '__ dict__', '__doc__', '__getattribute__', '__getitem__', '__ha sh__', '__init__', '__module__', '__new__', '__reduce__', '_ _reduce_ex__', '__repr__', '__setattr__', '__str__', '__weak ref__', '_b_base_', '_b_needsfree_', '_fields_', '_objects', 'x', 'y', 'z'] I don't know why the iterator (where ever it is) didn't get incremented. Thanks for any insight. Mark -- http://mail.python.org/mailman/listinfo/python-list
Re: Iterable Ctypes Struct
En Wed, 11 Feb 2009 00:31:26 -0200, 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__ 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]) 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
Iterable Ctypes Struct
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. 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? Thx, Mark -- http://mail.python.org/mailman/listinfo/python-list