diff options
author | Raymond Hettinger <python@rcn.com> | 2011-03-25 23:00:13 (GMT) |
---|---|---|
committer | Raymond Hettinger <python@rcn.com> | 2011-03-25 23:00:13 (GMT) |
commit | 9aa5a34b6b38ef9eec67f80a8f105c8c5a7a9c10 (patch) | |
tree | 0a91fce7125acf1fa6ba1605cf5c6ccc291d0a9a /Lib | |
parent | f9e9a6f403af61c6aead4cfe766fb1efbb058171 (diff) | |
download | cpython-9aa5a34b6b38ef9eec67f80a8f105c8c5a7a9c10.zip cpython-9aa5a34b6b38ef9eec67f80a8f105c8c5a7a9c10.tar.gz cpython-9aa5a34b6b38ef9eec67f80a8f105c8c5a7a9c10.tar.bz2 |
Issue #11666: Teach pydoc to display full help for named tuples
Diffstat (limited to 'Lib')
-rwxr-xr-x | Lib/pydoc.py | 21 | ||||
-rw-r--r-- | Lib/test/test_pydoc.py | 12 |
2 files changed, 23 insertions, 10 deletions
diff --git a/Lib/pydoc.py b/Lib/pydoc.py index ff9a5f4..8b6f7ee 100755 --- a/Lib/pydoc.py +++ b/Lib/pydoc.py @@ -156,7 +156,7 @@ def _split_list(s, predicate): no.append(x) return yes, no -def visiblename(name, all=None): +def visiblename(name, all=None, obj=None): """Decide whether to show documentation on a variable.""" # Certain special names are redundant. _hidden_names = ('__builtins__', '__doc__', '__file__', '__path__', @@ -164,6 +164,9 @@ def visiblename(name, all=None): if name in _hidden_names: return 0 # Private names are hidden, but special names are displayed. if name.startswith('__') and name.endswith('__'): return 1 + # Namedtuples have public fields and methods with a single leading underscore + if name.startswith('_') and hasattr(obj, '_fields'): + return 1 if all is not None: # only document that which the programmer exported in __all__ return name in all @@ -627,7 +630,7 @@ class HTMLDoc(Doc): # if __all__ exists, believe it. Otherwise use old heuristic. if (all is not None or (inspect.getmodule(value) or object) is object): - if visiblename(key, all): + if visiblename(key, all, object): classes.append((key, value)) cdict[key] = cdict[value] = '#' + key for key, value in classes: @@ -643,13 +646,13 @@ class HTMLDoc(Doc): # if __all__ exists, believe it. Otherwise use old heuristic. if (all is not None or inspect.isbuiltin(value) or inspect.getmodule(value) is object): - if visiblename(key, all): + if visiblename(key, all, object): funcs.append((key, value)) fdict[key] = '#-' + key if inspect.isfunction(value): fdict[value] = fdict[key] data = [] for key, value in inspect.getmembers(object, isdata): - if visiblename(key, all): + if visiblename(key, all, object): data.append((key, value)) doc = self.markup(getdoc(object), self.preformat, fdict, cdict) @@ -773,7 +776,7 @@ class HTMLDoc(Doc): push('\n') return attrs - attrs = filter(lambda data: visiblename(data[0]), + attrs = filter(lambda data: visiblename(data[0], obj=object), classify_class_attrs(object)) mdict = {} for key, kind, homecls, value in attrs: @@ -1042,18 +1045,18 @@ class TextDoc(Doc): # if __all__ exists, believe it. Otherwise use old heuristic. if (all is not None or (inspect.getmodule(value) or object) is object): - if visiblename(key, all): + if visiblename(key, all, object): classes.append((key, value)) funcs = [] for key, value in inspect.getmembers(object, inspect.isroutine): # if __all__ exists, believe it. Otherwise use old heuristic. if (all is not None or inspect.isbuiltin(value) or inspect.getmodule(value) is object): - if visiblename(key, all): + if visiblename(key, all, object): funcs.append((key, value)) data = [] for key, value in inspect.getmembers(object, isdata): - if visiblename(key, all): + if visiblename(key, all, object): data.append((key, value)) modpkgs = [] @@ -1186,7 +1189,7 @@ class TextDoc(Doc): name, mod, maxlen=70, doc=doc) + '\n') return attrs - attrs = filter(lambda data: visiblename(data[0]), + attrs = filter(lambda data: visiblename(data[0], obj=object), classify_class_attrs(object)) while attrs: if mro: diff --git a/Lib/test/test_pydoc.py b/Lib/test/test_pydoc.py index 0685488..2e67290 100644 --- a/Lib/test/test_pydoc.py +++ b/Lib/test/test_pydoc.py @@ -10,8 +10,9 @@ import unittest import xml.etree import test.test_support from contextlib import contextmanager +from collections import namedtuple from test.test_support import ( - TESTFN, forget, rmtree, EnvironmentVarGuard, reap_children) + TESTFN, forget, rmtree, EnvironmentVarGuard, reap_children, captured_stdout) from test import pydoc_mod @@ -340,6 +341,15 @@ class TestDescriptions(unittest.TestCase): expected = 'C in module %s object' % __name__ self.assertIn(expected, pydoc.render_doc(c)) + def test_namedtuple_public_underscore(self): + NT = namedtuple('NT', ['abc', 'def'], rename=True) + with captured_stdout() as help_io: + help(NT) + helptext = help_io.getvalue() + self.assertIn('_1', helptext) + self.assertIn('_replace', helptext) + self.assertIn('_asdict', helptext) + def test_main(): test.test_support.run_unittest(PyDocDocTest, |