From 6ca7d41c1f0f2f6ef654f3ff6241c80cccf06ab3 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Thu, 18 Apr 2002 00:22:00 +0000 Subject: [PATCH] SF bug 542984. Change type_get_doc (the get function for __doc__) to look in tp_dict more often, and if it finds a descriptor in tp_dict, to call it (with a NULL instance). This means you can add a __doc__ descriptor to a new-style class that returns instance docs when called on an instance, and class docs when called on a class -- or the same docs in either case, but lazily computed. I'll also check this into the 2.2 maintenance branch. --- Objects/typeobject.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/Objects/typeobject.c b/Objects/typeobject.c index deb73201ebb..f647d57b6e7 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -82,15 +82,19 @@ static PyObject * type_get_doc(PyTypeObject *type, void *context) { PyObject *result; - if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) { - if (type->tp_doc == NULL) { - Py_INCREF(Py_None); - return Py_None; - } + if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE) && type->tp_doc != NULL) return PyString_FromString(type->tp_doc); - } result = PyDict_GetItemString(type->tp_dict, "__doc__"); - Py_INCREF(result); + if (result == NULL) { + result = Py_None; + Py_INCREF(result); + } + else if (result->ob_type->tp_descr_get) { + result = result->ob_type->tp_descr_get(result, NULL, type); + } + else { + Py_INCREF(result); + } return result; }