On 11 May 2010 13:03, Josh Allen <[email protected]> wrote: > I have been using Cython's pure Python mode for a while now, and have > generally been quite pleased with it. Now I am trying to use it with a > more complex codebase, which has led me to encounter some "rough around > the edges" features. I am using Cython 0.12.1 with Python 2.6.5. > > This particular bug has to do with method overriding in a derived class. > Consider the Python file foo.py containing a base class Foo and derived > class Bar, with the method hello() implemented differently in each class: > > class Foo: > def hello(self): > print 'Hello from Foo.hello()' > class Bar(Foo): > def hello(self): > print 'Hello from Bar.hello()' > > The associated foo.pxd header file is: > > cdef class Foo: > cpdef hello(self) > cdef class Bar(Foo): > cpdef hello(self) > > My test script is as follows: > > from foo import Foo, Bar > f = Foo() > f.hello() # Should print 'Hello from Foo.hello()' > b = Bar() > b.hello() # Should print 'Hello from Bar.hello()' > > Before compiling, the test script works as expected. However, after > compiling, a TypeError is raised: > > Traceback (most recent call last): > File "test.py", line 7, in <module> > f.hello() > File "foo.py", line 6, in foo.Foo.hello (foo.c:512) > def hello(self): > TypeError: Cannot convert foo.Foo to foo.Bar > > I'd be happy to provide the generated C code as well. This seems to be > the offending line: > > if (!(likely(((__pyx_v_self) == Py_None) || > likely(__Pyx_TypeTest(__pyx_v_self, __pyx_ptype_3foo_Bar))))) > {__pyx_filename = __pyx_f[0]; __pyx_lineno = 6; __pyx_clineno = > __LINE__; goto __pyx_L1_error;} > > From what I can tell, this only allows objects of type Bar to continue, > and not those of type Foo, despite being a method of the Foo class. > Oddly enough, the line above was duplicated in the generated C code; I > wonder if one of them should test for __pyx_ptype_3foo_Foo instead, but > I don't know much about the Cython internals so I may be way off base. > > Note that this is a follow-up and clarification to > > http://codespeak.net/pipermail/cython-dev/2009-September/006846.html > > which seems to have not been fully addressed. > > _______________________________________________ > Cython-dev mailing list > [email protected] > http://codespeak.net/mailman/listinfo/cython-dev >
It seems there is a bug somewhere, unfortunately I was not able to catch it. I've attached a testcase showing that the behaviour of def vs. cpdef methods is different. -- Lisandro Dalcin --------------- CIMEC (INTEC/CONICET-UNL) Predio CONICET-Santa Fe Colectora RN 168 Km 472, Paraje El Pozo Tel: +54-342-4511594 (ext 1011) Tel/Fax: +54-342-4511169 l
methinherit.pyx
Description: Binary data
_______________________________________________ Cython-dev mailing list [email protected] http://codespeak.net/mailman/listinfo/cython-dev
