[Cython] [cython-users] which __new__ to use?

Stefan Behnel stefan_ml at behnel.de
Fri Jan 10 17:30:31 CET 2014


Nils Bruin, 22.11.2013 00:10:
> With the following classes:
> 
> cdef class A(object):
>     cdef int a
>     pass
> cdef class B(object):
>     pass
> 
> and the following multiply inherited classes:
> 
> The problem arises 
> 
> class C(object):
>     pass
> class D(C,B):
>     pass
> class F(B,C):
>     pass
> class E(C,A):
>     pass
> class G(A,C):
>     pass
> 
> I observe:
> 
> >>> D.__new__(D)
> 
> B.__new__(D) is not safe, use object.__new__()
> 
> >>> E.__new__(E)
> 
>  <__main__.E object at 0x6c56488>
> 
> >>> F.__new__(F)
> 
> <__main__.F object at 0x6c4fdd0>
> >>> G.__new__(G)
> <__main__.G object at 0x6c4fdd0>
> 
> 
> As you can see, a problem only arises for D, in which case there is 
> actually NOT a layout problem: when the class A is involved, where it does 
> matter which __new__ is used, that right one (I assume) is chosen in all 
> cases. A little googling suggests that this error might be coming from 
> tp_new_wrapper in Objects/typeobject.c, which tries to do some sanity 
> checks before calling type->tp_new. It is not clear to me, however, why 
> those sanity checks fail for D.__new__(D) and succeed for E.__new__(E)

I came up with this fix:

https://github.com/cython/cython/commit/ec37469dc61e0e24db448e9455b2483797afe936

It passes your test case and doesn't seem to break others so far.

However, this is a bit of a deep change, so I'd like to see some serious
user side testing before I'll happily push for its inclusion in Cython 0.20.

Stefan



More information about the cython-devel mailing list