]> granicus.if.org Git - python/commitdiff
SF bug 542984.
authorGuido van Rossum <guido@python.org>
Thu, 18 Apr 2002 00:22:00 +0000 (00:22 +0000)
committerGuido van Rossum <guido@python.org>
Thu, 18 Apr 2002 00:22:00 +0000 (00:22 +0000)
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

index deb73201ebb7c5444b1d7a0c4605f14ac8cb6851..f647d57b6e717e6d87d3e733f73ebb83ec93dc9f 100644 (file)
@@ -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;
 }