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<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? > > > About cdef classes: probably it's better to transform super().method(...) into direct form, e.g. BaseClass.method(self, ...) That would be more cdef-like than actually calling super.
Btw, super() should still be used if no method call pattern is matched. -- vitja.
_______________________________________________ cython-devel mailing list cython-devel@python.org http://mail.python.org/mailman/listinfo/cython-devel