13 Aug 11:25
[Cython] cython-generated class doesn't work when used as an iterator
From: Alex Mendes da Costa <alexmdac@...>
Subject: [Cython] cython-generated class doesn't work when used as an iterator
Newsgroups: gmane.comp.python.cython.devel
Date: 2008-08-13 09:25:39 GMT
Subject: [Cython] cython-generated class doesn't work when used as an iterator
Newsgroups: gmane.comp.python.cython.devel
Date: 2008-08-13 09:25:39 GMT
Hi,
I'm using cython to wrap DJB's primegen library (http://cr.yp.to/primegen.html).
Here's my pyx file:
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:
Thanks,
Alex
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)
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.[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'
>>> p = PrimeGen()
>>> dir(p)
['__class__', '__delattr__', '__doc__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', 'count', 'next', 'peek', 'skipto']
>>> dir(p)
['__class__', '__delattr__', '__doc__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', 'count', 'next', 'peek', 'skipto']
Thanks,
Alex
<div><div dir="ltr">Hi,<br><div class="gmail_quote"> <div dir="ltr"> <br>I'm using cython to wrap DJB's primegen library (<a href="http://cr.yp.to/primegen.html" target="_blank">http://cr.yp.to/primegen.html</a>).<br><br> Here's my pyx file:<br><br><div> cdef extern from "primegen.h":<br> ctypedef unsigned long uint32<br> ctypedef unsigned long long uint64<br><br> ctypedef struct primegen:<br> uint32 buf[16][2048]<br> uint64 p[512]<br> int num<br> int pos<br> uint64 base<br> uint64 L<br><br> void primegen_init(primegen* pg)<br> uint64 primegen_next(primegen* pg)<br> uint64 primegen_peek(primegen* pg)<br> uint64 primegen_count(primegen* pg, uint64 to)<br> void primegen_skipto(primegen* pg, uint64 to)<br><br>cdef class PrimeGen:<br> cdef primegen pg<br><br> def __new__(self):<br> primegen_init(&<a href="http://self.pg" target="_blank">self.pg</a>)<br><br> def next(self):<br> return primegen_next(&<a href="http://self.pg" target="_blank">self.pg</a>)<br><br> def peek(self):<br> return primegen_peek(&<a href="http://self.pg" target="_blank">self.pg</a>)<br><br> def count(self, uint64 to):<br> return primegen_count(&<a href="http://self.pg" target="_blank">self.pg</a>, to)<br><br> def skipto(self, uint64 to):<br> primegen_skipto(&<a href="http://self.pg" target="_blank">self.pg</a>, to)<br> </div> <br>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:<br><br><div> <span>Python 2.5.1 (r251:54863, Jan 17 2008, 19:35:17) <br>[GCC 4.0.1 (Apple Inc. build 5465)] on darwin<br> Type "help", "copyright", "credits" or "license" for more information.<br></span><span>>>> from primegen import PrimeGen</span><br><span>>>> class C:</span><br><span>... def __iter__(self):</span><br><span>... return PrimeGen()</span><br><span>... </span><br><span>>>> for i in C():</span><br><span>... print i</span><br><span>... </span><br><span>Traceback (most recent call last):</span><br><span> File "<stdin>", line 1, in <module></span><br><span>TypeError: __iter__ returned non-iterator of type 'primegen.PrimeGen'<br><br></span> </div>How come this doesn't work? The generated class definitely has the "next" method required by the iterator protocol.<br><br><div> <span>>>> p = PrimeGen()</span><br><span> >>> dir(p)</span><br><span> ['__class__', '__delattr__', '__doc__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', 'count', 'next', 'peek', 'skipto']</span><br> </div> <br>Thanks,<br>Alex</div> </div> </div></div>
RSS Feed