[Python-3000] Fixing super anyone?
Tim Delaney
tcdelaney at optusnet.com.au
Wed Apr 25 03:13:05 CEST 2007
I've been off sick from work for over a week - I've been following this
discussion, but now I think I've got something which matches all the
criteria we've been discussing, so I've changed my subscription address
temporarily to my home one.
It involves bytecode hacking for now, as well as a metaclass. The code is
attached. It's based partially off my 'self.super' recipe, but doesn't need
to use sys._getframe().
Recipe: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/286195
Basically, the metaclass modifies the bytecode to include some setup code to
any function that uses 'super'. The setup code generates the correct 'super'
object, and stores it as a local variable. All uses of LOAD_GLOBAL(super)
are changed to LOAD_FAST(super).
The one thing I would like to add is something I've got in my 'self.super'
recipe - I've got my own 'super' object that is callable. Calling it invokes
the super method of the current method i.e. if you've got the following
code:
class A(autosuper):
def f(self):
pass
class B(A):
def f(self):
super()
it would be functionally identical to the following:
class B(A):
def f(self):
super.f()
This could be easily implemented by having the 'super' constructor take a
'name' parameter (which would be passed the name of current method in the
setup code). Then when super() is called, it would perform the name lookup.
Tim Delaney
-------------- next part --------------
A non-text attachment was scrubbed...
Name: autosuper.py
Type: application/octet-stream
Size: 5330 bytes
Desc: not available
Url : http://mail.python.org/pipermail/python-3000/attachments/20070425/6b9124d7/attachment-0001.obj
More information about the Python-3000
mailing list