[Cython] PEP 3135 -- New Super

Vitja Makarov vitja.makarov at gmail.com
Tue Jul 12 09:46:21 CEST 2011


2011/7/6 Stefan Behnel <stefan_ml at behnel.de>

> Vitja Makarov, 06.07.2011 09:05:
>
>  2011/7/6 Stefan Behnel<stefan_ml at 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.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/cython-devel/attachments/20110712/3584af9a/attachment.html>


More information about the cython-devel mailing list