On Dec 2, 2008, at 9:48 PM, Kay Schluehr wrote:

> Dear Cython list,
>
> while investigating the type semantics and constraints of Cython I
> stumbled over a problem I consider a bug. Here is some brief  
> description
> using an example
>
> # point.pyx
> #
> # defines an extension type and a conversion between a C struct and an
> extension type
> #
> import random
>
> cdef struct CPoint:
>     int x
>     int y
>
> cdef class ExtPoint:
>     cdef int x
>     cdef int y
>
>     cdef convert(self, CPoint pt):
>         self.x = pt.x
>         self.y = pt.y
>
> cdef convert(self, CPoint pt):
>     self.x = pt.x
>     self.y = pt.y
>
> cpdef test():
>     cdef CPoint pt
>     pt.x = random.randrange(100)
>     pt.y = random.randrange(100)
>     ep = ExtPoint()
>     convert(ep, pt)    # o.k   - compiles
>     ep.convert(pt)     # n.o.k - fails to compile
>     return ep
>
> # end of point.pyx
>
> The standalone convert() function equals the convert() C-method of the
> ExtPoint extension type. However the compiler accepts the function  
> call
> but rejects the method call:
>
> Error converting Pyrex file to C:
> ------------------------------------------------------------
> ...
>     cdef CPoint pt
>     pt.x = random.randrange(100)
>     pt.y = random.randrange(100)
>     ep = ExtPoint()
>     convert(ep, pt)  # o.k   - compiles
>     ep.convert(pt)   # n.o.k - fails to compile
>                 ^
> ------------------------------------------------------------
>
> point.pyx:91:17: Cannot convert 'CPoint' to Python object
>
> There is no indication why the compiler tries to perform an automatic
> type conversion since the C method isn't exposed to Python anyway.

You need to declare ep to be of type ExtPoint, i.e.

cdef ExtPoint ep = ExtPoint()

otherwise, it thinks it's just an ordinary Python object and an  
ordinary python method to be looked up at runtime.

- Robert

_______________________________________________
Cython-dev mailing list
[email protected]
http://codespeak.net/mailman/listinfo/cython-dev

Reply via email to