[Cython] PEP 3135 -- New Super

Vitja Makarov vitja.makarov at gmail.com
Wed Jul 6 09:05:12 CEST 2011


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
>>>>
>>>>> 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>)"

So we only have func_class (that is inside cyfunction object) and
first function argument of method to super()

I tried to implement super() for cdef classes and it worked. It works
very simple:

cdef class Foo:
    def meth(self):
        super().meth() # is transformed into super(Foo, self)

-- 
vitja.


More information about the cython-devel mailing list