On 7 July 2011 17:09, Vitja Makarov <vitja.maka...@gmail.com> wrote: > 2011/7/6 Vitja Makarov <vitja.maka...@gmail.com>: >> 2011/7/6 Stefan Behnel <stefan...@behnel.de>: >>> Vitja Makarov, 06.07.2011 09:05: >>>> >>>> 2011/7/6 Stefan Behnel<stefan...@behnel.de>: >>>>> >>>>> Stefan Behnel, 05.07.2011 10:04: >>>>>> >>>>>> Vitja Makarov, 05.07.2011 09:17: >>>>>>> >>>>>>> 2011/7/5 Stefan Behnel: >>>>>>>> >>>>>>>> Vitja Makarov, 05.07.2011 08:21: >>>>>>>>> >>>>>>>>> I was thinking about implementing new super() with no arguments. >>>>>>>> >>>>>>>> http://trac.cython.org/cython_trac/ticket/696 >>>>>>>> >>>>>>>>> The problem is where to store __class__, I see two options here: >>>>>>>>> >>>>>>>>> 1. Add func_class member to CyFunction, this way __class__ will be >>>>>>>>> private and not visible for inner functions: >>>>>>>>> 2. Put it into closure >>>>>>>> >>>>>>>> The second option has the advantage of requiring the field only when >>>>>>>> super() >>>>>>>> is used, whereas the first impacts all functions. >>>>>>>> >>>>>>>> I would expect that programs commonly have a lot more functions than >>>>>>>> specifically methods that use a no-argument call to super(), so this >>>>>>>> may >>>>>>>> make a difference. >>>>>>>> >>>>>>> >>>>>>> So, now classes are created the following way: >>>>>>> >>>>>>> class_dict = {} >>>>>>> class_dict.foo = foo_func >>>>>>> class = CreateClass(class_dict) >>>>>>> >>>>>>> So after class is created I should check its dict for CyFunction >>>>>>> members (maybe only ones that actually require __class__) >>>>>>> and set __class__: >>>>>>> >>>>>>> for value in class.__dict__.itervalues(): >>>>>>> if isinstance(value, CyFunction) and value.func_class is WantClass: >>>>>>> value.func_class = class >>>>>>> >>>>>>> Btw, first way requires cyfunction signature change, it would accept >>>>>>> cyfunction object as first argument. >>>>>> >>>>>> We currently pass the binding (i.e. owning) object, right? >>>>> >>>>> So, how would this work for methods? We need to pass the 'self' object >>>>> there, which the CyFunction doesn't know. If anything, it only knows the >>>>> class it was defined in, which doesn't help here. >>>> >>>> From PEP: "super() is equivalent to: super(__class__,<firstarg>)" >>> >>> I wasn't speaking of super(). What I meant, was: how do we pass 'self' when >>> we pass the CyFunction object as the first argument? >>> >> >> >> Oh, ok. Now we pass closure or nothing in self. So method's self is >> passed via tuple. >> Instancemethod do this for us. Now CyFucntion uses PyCFunction_Call we >> can override this and change signature of cyfunction to: >> >> PyObject func(CyFunction *func, PyObject *self, PyObject *args, >> PyObject *kwargs); >> >> This way we should implement new instancemethod type. >> > > I've add support for new super() for cdef classes here: > https://github.com/vitek/cython/compare/_new_super > > Pure python classes would require my _bindings branch. >
I also need that branch to continue my work on fused types. The naming suggests I can't pull from it and start building on top of it? Did you have any plans to review it Stefan? Otherwise I won't mind giving it a go. > -- > vitja. > _______________________________________________ > cython-devel mailing list > cython-devel@python.org > http://mail.python.org/mailman/listinfo/cython-devel > _______________________________________________ cython-devel mailing list cython-devel@python.org http://mail.python.org/mailman/listinfo/cython-devel