You actually need to provide a __next__ method. See http://www.cosc.canterbury.ac.nz/greg.ewing/python/Pyrex/version/Doc/ Manual/special_methods.html
- Robert On Aug 13, 2008, at 2:25 AM, Alex Mendes da Costa wrote: > Hi, > > I'm using cython to wrap DJB's primegen library (http://cr.yp.to/ > primegen.html). > > Here's my pyx file: > > cdef extern from "primegen.h": > ctypedef unsigned long uint32 > ctypedef unsigned long long uint64 > > ctypedef struct primegen: > uint32 buf[16][2048] > uint64 p[512] > int num > int pos > uint64 base > uint64 L > > void primegen_init(primegen* pg) > uint64 primegen_next(primegen* pg) > uint64 primegen_peek(primegen* pg) > uint64 primegen_count(primegen* pg, uint64 to) > void primegen_skipto(primegen* pg, uint64 to) > > cdef class PrimeGen: > cdef primegen pg > > def __new__(self): > primegen_init(&self.pg) > > def next(self): > return primegen_next(&self.pg) > > def peek(self): > return primegen_peek(&self.pg) > > def count(self, uint64 to): > return primegen_count(&self.pg, to) > > def skipto(self, uint64 to): > primegen_skipto(&self.pg, to) > > Notice that the class has a method called "next". This means that > it should be usable as an iterator. Here's what happens if I try > to do that: > > Python 2.5.1 (r251:54863, Jan 17 2008, 19:35:17) > [GCC 4.0.1 (Apple Inc. build 5465)] on darwin > Type "help", "copyright", "credits" or "license" for more information. > >>> from primegen import PrimeGen > >>> class C: > ... def __iter__(self): > ... return PrimeGen() > ... > >>> for i in C(): > ... print i > ... > Traceback (most recent call last): > File "<stdin>", line 1, in <module> > TypeError: __iter__ returned non-iterator of type 'primegen.PrimeGen' > > How come this doesn't work? The generated class definitely has the > "next" method required by the iterator protocol. > > >>> p = PrimeGen() > >>> dir(p) > ['__class__', '__delattr__', '__doc__', '__getattribute__', > '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', > '__repr__', '__setattr__', '__str__', 'count', 'next', 'peek', > 'skipto'] > > Thanks, > Alex > _______________________________________________ > Cython-dev mailing list > [email protected] > http://codespeak.net/mailman/listinfo/cython-dev _______________________________________________ Cython-dev mailing list [email protected] http://codespeak.net/mailman/listinfo/cython-dev
