[Python-3000] Binding builtin function to class

Haoyu Bai divinekid at gmail.com
Sun Apr 27 18:24:48 CEST 2008


Hello,

I'm a GSoC student working on SWIG's Python 3 support. When doing 
experiment on Python 3's new features, the different behavior between 
binding 'function' and 'builtin_function_or_method' confused me.

As we know, unbound method is removed in Python 3. To bind a function to 
a class, we can directly use this instead:

MyClass.myfunc = func


But in the case of builtin function, it can't work. The below code 
demonstrates this:

class Test:
     pass

def afunc(*args):
     print(*args)

Test.prt = print
Test.func = afunc

t = Test()
t.prt() #nothing
t.func() #<__main__.Test object at 0xb79987ec>


I know this is not a bug, but however it is an exception in the 
language, what Python trying to avoid.

Since all C function in extension module is treated as builtin function 
or method, the problem maybe bigger than it looks like. In the SWIG's 
case, it originally uses new.instancemethod to generate unbound method 
from the C function in DLL module. The code snippet looks like this:

class TestBase(object):
     """Proxy of C++ TestBase class"""
     #some unrelated code omitted
     pass
#_test.TestBase_test is the C function in _test DLL module
TestBase.test = new.instancemethod(_test.TestBase_test,None,TestBase)

Is there a corresponding way to do it in Python 3? A workaround I found is:

from types import MethodType
class TestBase(object):
     """Proxy of C++ TestBase class"""
     def __init__(self, *args):
         #some initialization code
         ...
         self.test = MethodType(_test.TestBase_test, self)

But this changed the original code structure so the migration would be 
more complicated. Is there any better way to get rid of it?

Thank you a lot!

Best regards,

Haoyu Bai
4/27/2008


More information about the Python-3000 mailing list