]> granicus.if.org Git - python/commitdiff
SF bug [#472347] pydoc and properties.
authorTim Peters <tim.peters@gmail.com>
Thu, 18 Oct 2001 19:56:17 +0000 (19:56 +0000)
committerTim Peters <tim.peters@gmail.com>
Thu, 18 Oct 2001 19:56:17 +0000 (19:56 +0000)
The GUI-mode code to display properties blew up if the property functions
(get, set, etc) weren't simply methods (or functions).

"The problem" here is really that the generic document() method dispatches
to one of .doc{routine, class, module, other}(), but all of those require
a different(!) number of arguments.  Thus document isn't general-purpose
at all:  you have to know exactly what kind of thing is it you're going
to document first, in order to pass the correct number of arguments to
.document for it to pass on.  As an expedient hack, just tacked "*ignored"
on to the end of the formal argument lists for the .docXXX routines so
that .document's caller doesn't have to know in advance which path
.document is going to take.

Lib/pydoc.py
Lib/test/pydocfodder.py

index 1e333398b8819ed0f39b8e6e128ac65cd43cc792..911291b2e8f511ec25dadbc65d873c8951fc2f77 100755 (executable)
@@ -486,7 +486,7 @@ TT { font-family: lucidatypewriter, lucida console, courier }
                     entry, modname, c)
         return '<dl>\n%s</dl>\n' % result
 
-    def docmodule(self, object, name=None, mod=None):
+    def docmodule(self, object, name=None, mod=None, *ignored):
         """Produce HTML documentation for a module object."""
         name = object.__name__ # ignore the passed-in name
         parts = split(name, '.')
@@ -601,7 +601,8 @@ TT { font-family: lucidatypewriter, lucida console, courier }
 
         return result
 
-    def docclass(self, object, name=None, mod=None, funcs={}, classes={}):
+    def docclass(self, object, name=None, mod=None, funcs={}, classes={},
+                 *ignored):
         """Produce HTML documentation for a class object."""
         realname = object.__name__
         name = name or realname
@@ -800,7 +801,7 @@ TT { font-family: lucidatypewriter, lucida console, courier }
             doc = doc and '<dd><tt>%s</tt></dd>' % doc
             return '<dl><dt>%s</dt>%s</dl>\n' % (decl, doc)
 
-    def docother(self, object, name=None, mod=None):
+    def docother(self, object, name=None, mod=None, *ignored):
         """Produce HTML documentation for a data object."""
         lhs = name and '<strong>%s</strong> = ' % name or ''
         return lhs + self.repr(object)
index 7ccac5e40ff6a6bd222f78abc2c11fe76673cc11..becdf2250e8aabe37aabc0c195b8dfe5fe68b872 100644 (file)
@@ -177,3 +177,34 @@ class D_new(B_new, C_new):
         "Method defined in C and D."
     def D_method(self):
         "Method defined in D."
+
+class FunkyProperties(object):
+    """From SF bug 472347, by Roeland Rengelink.
+
+    Property getters etc may not be vanilla functions or methods,
+    and this used to make GUI pydoc blow up.
+    """
+
+    def __init__(self):
+        self.desc = {'x':0}
+
+    class get_desc:
+        def __init__(self, attr):
+            self.attr = attr
+        def __call__(self, inst):
+            print 'Get called', self, inst
+            return inst.desc[self.attr]
+    class set_desc:
+        def __init__(self, attr):
+            self.attr = attr
+        def __call__(self, inst, val):
+            print 'Set called', self, inst, val
+            inst.desc[self.attr] = val
+    class del_desc:
+        def __init__(self, attr):
+            self.attr = attr
+        def __call__(self, inst):
+            print 'Del called', self, inst
+            del inst.desc[self.attr]
+
+    x = property(get_desc('x'), set_desc('x'), del_desc('x'), 'prop x')