Patch #711902: Cause pydoc to show data descriptor __doc__ strings.
This commit is contained in:
parent
e86a59af88
commit
e59e2bab8f
@ -161,6 +161,31 @@ Note:
|
|||||||
Return true if the object is a user-defined or built-in function or method.
|
Return true if the object is a user-defined or built-in function or method.
|
||||||
\end{funcdesc}
|
\end{funcdesc}
|
||||||
|
|
||||||
|
\begin{funcdesc}{ismethoddescriptor}{object}
|
||||||
|
Return true if the object is a method descriptor, but not if ismethod() or
|
||||||
|
isclass() or isfunction() are true.
|
||||||
|
|
||||||
|
This is new as of Python 2.2, and, for example, is true of int.__add__.
|
||||||
|
An object passing this test has a __get__ attribute but not a __set__
|
||||||
|
attribute, but beyond that the set of attributes varies. __name__ is
|
||||||
|
usually sensible, and __doc__ often is.
|
||||||
|
|
||||||
|
Methods implemented via descriptors that also pass one of the other
|
||||||
|
tests return false from the ismethoddescriptor() test, simply because
|
||||||
|
the other tests promise more -- you can, e.g., count on having the
|
||||||
|
im_func attribute (etc) when an object passes ismethod().
|
||||||
|
\end{funcdesc}
|
||||||
|
|
||||||
|
\begin{funcdesc}{isdatadescriptor}{object}
|
||||||
|
Return true if the object is a data descriptor.
|
||||||
|
|
||||||
|
Data descriptors have both a __get__ and a __set__ attribute. Examples are
|
||||||
|
properties (defined in Python) and getsets and members (defined in C).
|
||||||
|
Typically, data descriptors will also have __name__ and __doc__ attributes
|
||||||
|
(properties, getsets, and members have both of these attributes), but this
|
||||||
|
is not guaranteed.
|
||||||
|
\end{funcdesc}
|
||||||
|
|
||||||
\subsection{Retrieving source code
|
\subsection{Retrieving source code
|
||||||
\label{inspect-source}}
|
\label{inspect-source}}
|
||||||
|
|
||||||
|
@ -78,6 +78,16 @@ def ismethoddescriptor(object):
|
|||||||
and not isfunction(object)
|
and not isfunction(object)
|
||||||
and not isclass(object))
|
and not isclass(object))
|
||||||
|
|
||||||
|
def isdatadescriptor(object):
|
||||||
|
"""Return true if the object is a data descriptor.
|
||||||
|
|
||||||
|
Data descriptors have both a __get__ and a __set__ attribute. Examples are
|
||||||
|
properties (defined in Python) and getsets and members (defined in C).
|
||||||
|
Typically, data descriptors will also have __name__ and __doc__ attributes
|
||||||
|
(properties, getsets, and members have both of these attributes), but this
|
||||||
|
is not guaranteed."""
|
||||||
|
return (hasattr(object, "__set__") and hasattr(object, "__get__"))
|
||||||
|
|
||||||
def isfunction(object):
|
def isfunction(object):
|
||||||
"""Return true if the object is a user-defined function.
|
"""Return true if the object is a user-defined function.
|
||||||
|
|
||||||
|
@ -686,7 +686,7 @@ class HTMLDoc(Doc):
|
|||||||
push(msg)
|
push(msg)
|
||||||
for name, kind, homecls, value in ok:
|
for name, kind, homecls, value in ok:
|
||||||
base = self.docother(getattr(object, name), name, mod)
|
base = self.docother(getattr(object, name), name, mod)
|
||||||
if callable(value):
|
if callable(value) or inspect.isdatadescriptor(value):
|
||||||
doc = getattr(value, "__doc__", None)
|
doc = getattr(value, "__doc__", None)
|
||||||
else:
|
else:
|
||||||
doc = None
|
doc = None
|
||||||
@ -1087,7 +1087,7 @@ class TextDoc(Doc):
|
|||||||
hr.maybe()
|
hr.maybe()
|
||||||
push(msg)
|
push(msg)
|
||||||
for name, kind, homecls, value in ok:
|
for name, kind, homecls, value in ok:
|
||||||
if callable(value):
|
if callable(value) or inspect.isdatadescriptor(value):
|
||||||
doc = getattr(value, "__doc__", None)
|
doc = getattr(value, "__doc__", None)
|
||||||
else:
|
else:
|
||||||
doc = None
|
doc = None
|
||||||
|
@ -61,6 +61,7 @@ class FesteringGob(MalodorousPervert, ParrotDroppings):
|
|||||||
# isbuiltin, isroutine, getmembers, getdoc, getfile, getmodule,
|
# isbuiltin, isroutine, getmembers, getdoc, getfile, getmodule,
|
||||||
# getsourcefile, getcomments, getsource, getclasstree, getargspec,
|
# getsourcefile, getcomments, getsource, getclasstree, getargspec,
|
||||||
# getargvalues, formatargspec, formatargvalues, currentframe, stack, trace
|
# getargvalues, formatargspec, formatargvalues, currentframe, stack, trace
|
||||||
|
# isdatadescriptor
|
||||||
|
|
||||||
from test.test_support import TestFailed, TESTFN
|
from test.test_support import TestFailed, TESTFN
|
||||||
import sys, imp, os, string
|
import sys, imp, os, string
|
||||||
@ -104,6 +105,8 @@ istest(inspect.ismethod, 'mod.StupidGit.abuse')
|
|||||||
istest(inspect.ismethod, 'git.argue')
|
istest(inspect.ismethod, 'git.argue')
|
||||||
istest(inspect.ismodule, 'mod')
|
istest(inspect.ismodule, 'mod')
|
||||||
istest(inspect.istraceback, 'tb')
|
istest(inspect.istraceback, 'tb')
|
||||||
|
istest(inspect.isdatadescriptor, '__builtins__.file.closed')
|
||||||
|
istest(inspect.isdatadescriptor, '__builtins__.file.softspace')
|
||||||
test(inspect.isroutine(mod.spam), 'isroutine(mod.spam)')
|
test(inspect.isroutine(mod.spam), 'isroutine(mod.spam)')
|
||||||
test(inspect.isroutine([].count), 'isroutine([].count)')
|
test(inspect.isroutine([].count), 'isroutine([].count)')
|
||||||
|
|
||||||
|
@ -21,6 +21,9 @@ Extension modules
|
|||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- inspect.is{method|data}descriptor was added, to allow pydoc display
|
||||||
|
__doc__ of data descriptors.
|
||||||
|
|
||||||
- Fixed socket speed loss caused by use of the _socketobject wrapper class
|
- Fixed socket speed loss caused by use of the _socketobject wrapper class
|
||||||
in socket.py.
|
in socket.py.
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user