[Python-3000] PEP 3135 (New Super) - what to do?
Tim Delaney
timothy.c.delaney at gmail.com
Mon Jun 11 22:51:07 CEST 2007
Guido van Rossum wrote:
> I'm very tempted to check in my patch even though the PEP isn't
> updated (it's been renamed from PEP 367 though). Any objections?
Sorry - had to go visit family on the long weekend - only got back late last
night.
My only objection is the special-casing of the 'super' name - specifically,
that it *won't* work if super is assigned to something else, and then called
with the no-arg version. But I'm happy to have the changes checked in, and
look at whether we can fix that without a performance penalty later.
I'll update the PEP when I get the chance to reflect the new direction.
Ironically, it's now gone back more towards Calvin's original approach (and
my original self.super recipe).
So - just clarifying the semantics for the PEP:
1. super() is a shortcut for super(__class__, first_arg).
Any reason we wouldn't just emit bytecode for the above if we detect a
no-arg call of super()? Ah - in case 'super' had been rebound. We could
continue to make 'super' a non-rebindable name.
2. __class__ can be called directly.
__class__ will be available in any frame that uses either 'super' or
'__class__' (including inner functions of methods).
What if the function is *not* inside a class (lexically)? Will __class__
exist, or will it be None?
> It is python.org/sf/1727209, use the latest (topmost) super2.diff
> patch.
> This would make the new and improved syntax super().foo(), which gets
> the class and object from the current frame, as the __class__ cell and
> the first argument, respectively.
>
> Neither __class__ nor super are keywords, but the compiler spots the
> use of 'super' as a free variable and makes sure the '__class__' is
> available in any frame where 'super' is used.
>
> Code is welcome to also use __class__ directly. It is set to the class
> before decoration (since this is the only way that I can figure out
> how to generate the code).
>
> The old syntax super(SomeClass, self) still works; also,
> super(__class__, self) is equivalent (assuming SomeClass is the
> nearest lexically containing class).
Tim Delaney
More information about the Python-3000
mailing list