[Python-Dev] [Python-3000] Pre-pre PEP for 'super' keyword
Tim Delaney
tcdelaney at optusnet.com.au
Mon Apr 30 14:47:41 CEST 2007
From: "Calvin Spealman" <ironfroggy at gmail.com>
> I believe the direction my PEP took with all this is a good bit
> primitive compared to this approach, although I still find value in it
> because at least a prototype came out of it that can be used to test
> the waters, regardless of if a more direct-in-the-language approach
> would be superior.
I've been working on improved super syntax for quite a while now - my
original approach was 'self.super' which used _getframe() and mro crawling
too. I hit on using bytecode hacking to instantiate a super object at the
start of the method to gain performance, which required storing the class in
co_consts, etc. It turns out that using a metaclass then makes this a lot
cleaner.
> However, I seem to think that if the __this_class__ PEP goes through,
> your version can be simplified as well. No tricky stuffy things in
> cells would be needed, but we can just expand the super 'keyword' to
> __super__(__this_class__, self), which has been suggested at least
> once. It seems this would be much simpler to implement, and it also
> brings up a second point.
>
> Also, I like that the super object is created at the beginning of the
> function, which my proposal couldn't even do. It is more efficient if
> you have multiple super calls, and gets around a problem I completely
> missed: what happens if the instance name were rebound before the
> implicit lookup of the instance object at the time of the super call?
You could expand it inline, but I think your second point is a strong
argument against it. Also, sticking the super instance into a cell means
that inner classes get access to it for free. Otherwise each inner class
would *also* need to instantiate a super instance, and __this_class__ (or
whatever it's called) would need to be in a cell for them to get access to
it instead.
BTW, one of my test cases involves multiple super calls in the same method -
there is a *very* large performance improvement by instantiating it once.
>> I think it would be very rare to need
>> super(ThisClass), although it makes some sense that that would be what
>> super means in a static method ...
>
> Does super mean anything in a static method today?
Well, since all super instantiations are explicit currently, it can mean
whatever you want it to.
class A(object):
@staticmethod
def f():
print super(A)
print super(A, A)
Cheers,
Tim Delaney
More information about the Python-Dev
mailing list