On Sun, Dec 19, 2010 at 1:31 AM, Kornél JAHN <corn...@gmail.com> wrote:
> Hello,
> I have been experiencing strange behavior regarding overloaded operators for
> cdef classes, using Cython 0.14. I think it can be regarded as a bug. See
> the example code below:
> # File: opoverload.pyx
> class Test1:
>     def __rmul__(self, other):
>         print "Calling Test1.__rmul__() with", type(self), type(other)
>     def __mul__(self, other):
>         print "Calling Test1.__mul__() with", type(self), type(other)
> cdef class Test2:
>     def __rmul__(self, other):
>         print "Calling Test2.__rmul__() with", type(self), type(other)
>     def __mul__(self, other):
>         print "Calling Test2.__mul__() with", type(self), type(other)
> Python console:
>>>> from opoverload import *
>>>> Test1() * 2.0
> Calling Test1.__mul__() with <type 'instance'> <type 'float'>
>>>> 2.0 * Test1()
> Calling Test1.__rmul__() with <type 'instance'> <type 'float'>
>>>> Test2() * 2.0
> Calling Test2.__mul__() with <type 'opoverload.Test2'> <type 'float'>
>>>> 2.0 * Test2()
> Calling Test2.__mul__() with <type 'float'> <type 'opoverload.Test2'>
> Test2.__rmul__() should be called and type(self) should not become float!

Have you read http://docs.cython.org/src/userguide/special_methods.html ?

> Can you please suggest a temporary workaround?

Manually check the types in your arithmetic functions. (Yes, I know
that's not as nice as it could be, it's just a reflection of the
underlying C API that we haven't glossed over.)

- Robert
_______________________________________________
Cython-dev mailing list
Cython-dev@codespeak.net
http://codespeak.net/mailman/listinfo/cython-dev

Reply via email to