Guido van Rossum wrote: > > Index: Objects/funcobject.c > =================================================================== > --- Objects/funcobject.c (revision 59154) > +++ Objects/funcobject.c (working copy) > @@ -643,8 +643,10 @@ > static PyObject * > func_descr_get(PyObject *func, PyObject *obj, PyObject *type) > { > - if (obj == Py_None) > - obj = NULL; > + if (obj == Py_None || obj == NULL) { > + Py_INCREF(func); > + return func; > + } > return PyMethod_New(func, obj, type); > } > > [well, except those should be tabs not spaces]
I've created a preliminary patch. Several unit tests are still failing. The patch is also changing some semantics. For example in Python 2.5: >>> import inspect >>> class Class(object): ... def method(self): pass ... >>> inspect.ismethod(Class().method) True >>> inspect.ismethod(Class.method) True But in py3k: >>> import inspect >>> class Class: ... def method(self): pass ... >>> inspect.ismethod(Class().method) True >>> inspect.ismethod(Class.method) False # !!! Without support from the descriptor it's not possible to distinguish a function from an unbound method any more. I like to add im_class to the function object. I don't see negative side effects, do you? /* Bind a function to an object */ static PyObject * func_descr_get(PyObject *func, PyObject *obj, PyObject *type) { if (obj == Py_None || obj == NULL) { Py_INCREF(func); if (type) { PyObject_SetAttrString(func, "im_class", type); } else { PyObject_SetAttrString(func, "im_class", Py_None); } return func; } return PyMethod_New(func, obj, type); } http://bugs.python.org/issue1493 Christian _______________________________________________ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com