gh-113157 gh-89519: Fix method descriptors (gh-113233)

Restore behaviors before classmethod descriptor chaining was introduced.
This commit is contained in:
Raymond Hettinger 2023-12-21 16:08:35 -06:00 committed by GitHub
parent 6a5b4736e5
commit d058eaeed4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 23 additions and 0 deletions

View File

@ -5004,6 +5004,21 @@ class ClassPropertiesAndMethods(unittest.TestCase):
gc.collect()
self.assertEqual(Parent.__subclasses__(), [])
def test_instance_method_get_behavior(self):
# test case for gh-113157
class A:
def meth(self):
return self
class B:
pass
a = A()
b = B()
b.meth = a.meth.__get__(b, B)
self.assertEqual(b.meth(), a)
def test_attr_raise_through_property(self):
# test case for gh-103272
class A:

View File

@ -319,6 +319,13 @@ method_traverse(PyMethodObject *im, visitproc visit, void *arg)
return 0;
}
static PyObject *
method_descr_get(PyObject *meth, PyObject *obj, PyObject *cls)
{
Py_INCREF(meth);
return meth;
}
PyTypeObject PyMethod_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
.tp_name = "method",
@ -339,6 +346,7 @@ PyTypeObject PyMethod_Type = {
.tp_methods = method_methods,
.tp_members = method_memberlist,
.tp_getset = method_getset,
.tp_descr_get = method_descr_get,
.tp_new = method_new,
};