mirror of
https://github.com/python/cpython.git
synced 2025-10-09 16:34:44 +00:00
Issue #24879: Teach pydoc to display named tuple fields in the order they were defined.
This commit is contained in:
parent
15b87bfedc
commit
95801bbe4e
3 changed files with 35 additions and 4 deletions
19
Lib/pydoc.py
19
Lib/pydoc.py
|
@ -209,6 +209,18 @@ def classify_class_attrs(object):
|
||||||
results.append((name, kind, cls, value))
|
results.append((name, kind, cls, value))
|
||||||
return results
|
return results
|
||||||
|
|
||||||
|
def sort_attributes(attrs, object):
|
||||||
|
'Sort the attrs list in-place by _fields and then alphabetically by name'
|
||||||
|
# This allows data descriptors to be ordered according
|
||||||
|
# to a _fields attribute if present.
|
||||||
|
fields = getattr(object, '_fields', [])
|
||||||
|
try:
|
||||||
|
field_order = {name : i-len(fields) for (i, name) in enumerate(fields)}
|
||||||
|
except TypeError:
|
||||||
|
field_order = {}
|
||||||
|
keyfunc = lambda attr: (field_order.get(attr[0], 0), attr[0])
|
||||||
|
attrs.sort(key=keyfunc)
|
||||||
|
|
||||||
# ----------------------------------------------------- module manipulation
|
# ----------------------------------------------------- module manipulation
|
||||||
|
|
||||||
def ispackage(path):
|
def ispackage(path):
|
||||||
|
@ -867,8 +879,7 @@ class HTMLDoc(Doc):
|
||||||
object.__module__)
|
object.__module__)
|
||||||
tag += ':<br>\n'
|
tag += ':<br>\n'
|
||||||
|
|
||||||
# Sort attrs by name.
|
sort_attributes(attrs, object)
|
||||||
attrs.sort(key=lambda t: t[0])
|
|
||||||
|
|
||||||
# Pump out the attrs, segregated by kind.
|
# Pump out the attrs, segregated by kind.
|
||||||
attrs = spill('Methods %s' % tag, attrs,
|
attrs = spill('Methods %s' % tag, attrs,
|
||||||
|
@ -1286,8 +1297,8 @@ location listed above.
|
||||||
else:
|
else:
|
||||||
tag = "inherited from %s" % classname(thisclass,
|
tag = "inherited from %s" % classname(thisclass,
|
||||||
object.__module__)
|
object.__module__)
|
||||||
# Sort attrs by name.
|
|
||||||
attrs.sort()
|
sort_attributes(attrs, object)
|
||||||
|
|
||||||
# Pump out the attrs, segregated by kind.
|
# Pump out the attrs, segregated by kind.
|
||||||
attrs = spill("Methods %s:\n" % tag, attrs,
|
attrs = spill("Methods %s:\n" % tag, attrs,
|
||||||
|
|
|
@ -811,6 +811,22 @@ class TestDescriptions(unittest.TestCase):
|
||||||
self.assertEqual(self._get_summary_line(t.wrap),
|
self.assertEqual(self._get_summary_line(t.wrap),
|
||||||
"wrap(text) method of textwrap.TextWrapper instance")
|
"wrap(text) method of textwrap.TextWrapper instance")
|
||||||
|
|
||||||
|
def test_field_order_for_named_tuples(self):
|
||||||
|
Person = namedtuple('Person', ['nickname', 'firstname', 'agegroup'])
|
||||||
|
s = pydoc.render_doc(Person)
|
||||||
|
self.assertLess(s.index('nickname'), s.index('firstname'))
|
||||||
|
self.assertLess(s.index('firstname'), s.index('agegroup'))
|
||||||
|
|
||||||
|
class NonIterableFields:
|
||||||
|
_fields = None
|
||||||
|
|
||||||
|
class NonHashableFields:
|
||||||
|
_fields = [[]]
|
||||||
|
|
||||||
|
# Make sure these doesn't fail
|
||||||
|
pydoc.render_doc(NonIterableFields)
|
||||||
|
pydoc.render_doc(NonHashableFields)
|
||||||
|
|
||||||
@requires_docstrings
|
@requires_docstrings
|
||||||
def test_bound_builtin_method(self):
|
def test_bound_builtin_method(self):
|
||||||
s = StringIO()
|
s = StringIO()
|
||||||
|
|
|
@ -26,6 +26,10 @@ Library
|
||||||
header in part headers. Patch written by Peter Landry and reviewed by Pierre
|
header in part headers. Patch written by Peter Landry and reviewed by Pierre
|
||||||
Quentel.
|
Quentel.
|
||||||
|
|
||||||
|
- Issue #24879: help() and pydoc can now list named tuple fields in the
|
||||||
|
order they were defined rather than alphabetically. The ordering is
|
||||||
|
determined by the _fields attribute if present.
|
||||||
|
|
||||||
- Issue #24774: Fix docstring in http.server.test. Patch from Chiu-Hsiang Hsu.
|
- Issue #24774: Fix docstring in http.server.test. Patch from Chiu-Hsiang Hsu.
|
||||||
|
|
||||||
- Issue #21159: Improve message in configparser.InterpolationMissingOptionError.
|
- Issue #21159: Improve message in configparser.InterpolationMissingOptionError.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue