no unbound methods in py3k

  • Thread starter Bruno Desthuilliers
  • Start date
B

Bruno Desthuilliers

Thomas Heller a écrit :
I'm currently using code like this to create unbound methods
from functions and stick them into classes:

method = new.instancemethod(raw_func, None, cls)
setattr(cls, name, method)

setattr(cls, name, func) would work better - given that either
isinstance(raw_func, function) or raw_func.__get__ is implemented the
right way.
 
T

Thomas Heller

I'm currently using code like this to create unbound methods
from functions and stick them into classes:

method = new.instancemethod(raw_func, None, cls)
setattr(cls, name, method)

Ok, python 2.6, run with the -3 flag, gives a warning that the new
module is going away in python 3.0, so the equivalent code is:

method = types.MethodType(raw_func, None, cls)
setattr(cls, name, method)

However, this code will not work in Python 3.0 because there are
no unbound methods any longer. The only way that I found so far
is this code:

method = lambda self, *args: raw_func(self, *args)
setattr(cls, name, method)

or the equivalent:

def method(self, *args):
return raw_func(self, *args)
setattr(cls, name, method)

but this is very ugly, imo. Is there another way?
The raw_func instances that I have are not descriptors (they
do not implement a __get__() method...)

Thanks,
Thomas
 
T

Thomas Heller

Christian said:
I've written PyInstanceMethod_Type for this use case. It's not (yet)
available for Python code. Barry hasn't decided whether he should expose
the type so late in the release cycle or not. See
http://bugs.python.org/issue3787 and
http://docs.python.org/dev/3.0/c-api/method.html?highlight=pyinstancemethod#PyInstanceMethod_Type

Ok, so one has to write an extension to access or expose it.

Oh, wait - there's ctypes:

Python 3.0rc1 (r30rc1:66507, Sep 18 2008, 14:47:08) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
from ctypes import *
pythonapi.PyInstanceMethod_New.restype = py_object
pythonapi.PyInstanceMethod_New.argtypes = [py_object]
instancemethod = pythonapi.PyInstanceMethod_New

class Example:
.... pass
....
Thomas
 
T

Terry Reedy

Thomas said:
Christian said:
I've written PyInstanceMethod_Type for this use case. It's not (yet)
available for Python code. Barry hasn't decided whether he should expose
the type so late in the release cycle or not. See
http://bugs.python.org/issue3787 and
http://docs.python.org/dev/3.0/c-api/method.html?highlight=pyinstancemethod#PyInstanceMethod_Type

Ok, so one has to write an extension to access or expose it.

Oh, wait - there's ctypes:

Python 3.0rc1 (r30rc1:66507, Sep 18 2008, 14:47:08) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
from ctypes import *
pythonapi.PyInstanceMethod_New.restype = py_object
pythonapi.PyInstanceMethod_New.argtypes = [py_object]
instancemethod = pythonapi.PyInstanceMethod_New

class Example:
... pass
...12597296

A pyCapi module that exposed via ctypes useful C functions not otherwise
accessible, with predefinition of restype and argtypes and anything else
needed, might make a nice addition to PyPI if not the stdlib. You have
done two here and I believe others have posted others.

tjr
 
T

Thomas Heller

Terry said:
Thomas said:
Christian said:
I've written PyInstanceMethod_Type for this use case. It's not (yet)
available for Python code.>> Oh, wait - there's ctypes:

Python 3.0rc1 (r30rc1:66507, Sep 18 2008, 14:47:08) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
from ctypes import *
pythonapi.PyInstanceMethod_New.restype = py_object
pythonapi.PyInstanceMethod_New.argtypes = [py_object]
instancemethod = pythonapi.PyInstanceMethod_New

class Example:
... pass
...
Example.id = instancemethod(id)

x = Example()
x.id() 12597296
id(x)
12597296

A pyCapi module that exposed via ctypes useful C functions not otherwise
accessible, with predefinition of restype and argtypes and anything else
needed, might make a nice addition to PyPI if not the stdlib. You have
done two here and I believe others have posted others.

Well, Lenard Lindstrom has some time ago contributed a module like that
which is available in the (more or less unmaintained) ctypeslib project:
http://svn.python.org/projects/ctypes/trunk/ctypeslib/ctypeslib/contrib/pythonhdr.py

However, it was probably more meant to provide a complete Python C api,
instead of concentrating on stuff not available to Python otherwise.

Thomas
 
T

Thomas Heller

Christian said:
I wrote the type to help the Pyrex and Cython developers to port their
software to 3.0. I planed to expose the type as
__builtin__.instancemethod but forgot it. Maybe we can convince Barry
together. He still considers my bug as a release blocker for 3.0.

Issue 3787 is marked as release blocker, but for 3.1 IIUC. Would it help
if I post my use case to the tracker?

Thomas
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,756
Messages
2,569,535
Members
45,008
Latest member
obedient dusk

Latest Threads

Top