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. -- vitja. _______________________________________________ cython-devel mailing list cython-devel@python.org http://mail.python.org/mailman/listinfo/cython-devel