[Python-checkins] cpython (2.7): Issue #11666: Teach pydoc to display full help for named tuples

raymond.hettinger python-checkins at python.org
Sat Mar 26 00:00:36 CET 2011


http://hg.python.org/cpython/rev/46aaa365111f
changeset: 68941:46aaa365111f
branch: 2.7
user: Raymond Hettinger <python at rcn.com>
date: Fri Mar 25 16:00:13 2011 -0700
summary:
 Issue #11666: Teach pydoc to display full help for named tuples
files:
 Lib/pydoc.py | 21 ++++++++++++---------
 Lib/test/test_pydoc.py | 12 +++++++++++-
 Misc/NEWS | 3 +++
 3 files changed, 26 insertions(+), 10 deletions(-)
diff --git a/Lib/pydoc.py b/Lib/pydoc.py
--- a/Lib/pydoc.py
+++ b/Lib/pydoc.py
@@ -156,7 +156,7 @@
 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 @@
 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 @@
 # 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 @@
 # 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 @@
 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 @@
 # 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 @@
 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
--- a/Lib/test/test_pydoc.py
+++ b/Lib/test/test_pydoc.py
@@ -10,8 +10,9 @@
 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 @@
 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,
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -43,6 +43,9 @@
 Library
 -------
 
+- Issue #11666: let help() display named tuple attributes and methods
+ that start with a leading underscore.
+
 - Issue #11673: Fix multiprocessing Array and RawArray constructors to accept a
 size of type 'long', rather than only accepting 'int'.
 
-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /