[Python-3000] [Python-Dev] PEP 367: New Super

Tim Delaney timothy.c.delaney at gmail.com
Sat May 26 10:13:51 CEST 2007


Guido van Rossum wrote:

>>> - Why not make super a keyword, instead of just prohibiting
>>> assignment to it? (I'm planning to do the same with None BTW in
>>> Py3k -- I find the "it's a name but you can't assign to it" a
>>> rather silly business and hardly "the simplest solution".)
>>
>> That's currently an open issue - I'm happy to make it a keyword - in
>> which case I think the title should be changed to "super as a
>> keyword" or something like that.
>
> As it was before. :-)
>
> What's the argument against?

I don't see any really, especially if None is to become a true keyword. But 
some people have raised objections.

>> Th preamble will only be added to functions/methods that cause the
>> 'super' cell to exist i.e. for CPython have 'super' in co.cellvars.
>> Functions that just have 'super' in co.freevars wouldn't have the
>> preamble.
>
> I think it's still too vague. For example:
>
> class C:
>  def f(s):
>    return 1
> class D(C):
>  pass
> def f(s):
>  return 2*super.f()
> D.f = f
> print(D().f())
>
> Should that work? I would be okay if it didn't, and if the super
> keyword is only allowed inside a method that is lexically inside a
> class. Then the second definition of f() should be a (phase 2)
> SyntaxError.

That would simplify things. I'll update the PEP.

> Was it ever decided whether the implicitly bound class should be:
>
> - the class object as produced by the class statement (before applying
> class decorators);
> - whatever is returned by the last class decorator (if any); or
> - whatever is bound to the class name at the time the method is
> invoked?
> I've got a hunch that #1 might be more solid; #3 seems asking for
> trouble.

I think #3 is definitely the wrong thing to do, but there have been 
arguments put forwards for both #1 and #2.

I think I'll put it as an open issue for now.

> There's also the issue of what to do when the method itself is
> decorated (the compiler can't know what the decorators mean, even for
> built-in decorators like classmethod).

I think that may be a different issue. If you do something like:

class A:
    @decorator
    def func(self):
        pass

class B(A):
    @decorator
    def func(self):
        super.func()

then `super.func()` will call whatever `super(B, self).func()` would now, 
which (I think) would result in calling the decorated function.

However, I think the staticmethod decorator would need to be able to modify 
the class instance that's held by the method. Or see my proposal below ...

> We could make the class in question a fourth attribute of the (poorly
> named) "bound method" object, e.g. im_class_for_super (im_super would
> be confusing IMO). Since this is used both by instance methods and by
> the @classmethod decorator, it's just about perfect for this purpose.
> (I would almost propose to reuse im_self for this purpose, but that's
> probably asking for subtle backwards incompatibilities and not worth
> it.)

I'm actually thinking instead that an unbound method should reference an 
unbound super instance for the appropriate class - which we could then call 
im_super.

For a bound instance or class method, im_super would return the appropriate 
bound super instance. In practice, it would work like your autosuper recipe 
using __super.

e.g.

class A:
    def func(self):
        pass

>>> print A.func.im_super
<super: <class 'A'>, NULL>

>>> print A().func.im_super
<super: <class 'A'>, <A object>>

> See my proposal above. It differs slightly in that the __super__ call
> is made only when the class is not NULL. On the expectation that a
> typical function that references super uses it exactly once per call
> (that would be by far the most common case I expect) this is just
> fine. In my proposal the 'super' variable contains whatever
> __super__(<class>, <inst>) returned, rather than <class> which you
> seem to be proposing here.

Think I must have been explaining poorly - if you look at the reference 
implementation in the PEP, you'll see that that's exactly what's held in the 
'super' free variable.

I think your proposal is basically what I was trying to convey - I'll look 
at rewording the PEP so it's less ambiguous. But I'd like your thoughts on 
the above proposal to keep a reference to the actual super object rather 
than the class.

Cheers,

Tim Delaney 



More information about the Python-3000 mailing list