Re: no unbound methods in py3k

2008-10-09 Thread Thomas Heller
Christian Heimes schrieb:
 Thomas Heller wrote:
 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...)
 
 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
...
 Example.id = instancemethod(id)

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


Thomas
--
http://mail.python.org/mailman/listinfo/python-list


Re: no unbound methods in py3k

2008-10-09 Thread Terry Reedy

Thomas Heller wrote:

Christian Heimes schrieb:

Thomas Heller wrote:

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...)
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
...

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.


tjr

--
http://mail.python.org/mailman/listinfo/python-list


Re: no unbound methods in py3k

2008-10-09 Thread Thomas Heller
Terry Reedy schrieb:
 Thomas Heller wrote:
 Christian Heimes schrieb:
 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
--
http://mail.python.org/mailman/listinfo/python-list


Re: no unbound methods in py3k

2008-10-09 Thread Christian Heimes

Thomas Heller wrote:

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

Oh, wait - there's ctypes:


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.


Christian

--
http://mail.python.org/mailman/listinfo/python-list


Re: no unbound methods in py3k

2008-10-09 Thread Thomas Heller
Christian Heimes schrieb:
 Thomas Heller wrote:
 Ok, so one has to write an extension to access or expose it.
 
 Oh, wait - there's ctypes:
 
 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
--
http://mail.python.org/mailman/listinfo/python-list


Re: no unbound methods in py3k

2008-10-08 Thread Christian Heimes

Thomas Heller wrote:

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...)


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


Christian

--
http://mail.python.org/mailman/listinfo/python-list


Re: no unbound methods in py3k

2008-10-08 Thread 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.


--
http://mail.python.org/mailman/listinfo/python-list