Added "Handling Docstring Indentation" section.
This commit is contained in:
parent
c43fa89298
commit
9e353b2297
82
pep-0257.txt
82
pep-0257.txt
|
@ -136,15 +136,9 @@ docstring, followed by a blank line, followed by a more elaborate
|
||||||
description. The summary line may be used by automatic indexing
|
description. The summary line may be used by automatic indexing
|
||||||
tools; it is important that it fits on one line and is separated from
|
tools; it is important that it fits on one line and is separated from
|
||||||
the rest of the docstring by a blank line. The summary line may be on
|
the rest of the docstring by a blank line. The summary line may be on
|
||||||
the same line as the opening quotes or on the next line.
|
the same line as the opening quotes or on the next line. The entire
|
||||||
|
docstring is indented the same as the quotes at its first line (see
|
||||||
The entire docstring is indented the same as the quotes at its first
|
example below).
|
||||||
line (see example below). Docstring processing tools will strip a
|
|
||||||
uniform amount of indentation from the second and further lines of the
|
|
||||||
docstring, equal to the minimum indentation of all non-blank lines
|
|
||||||
after the first line of the docstring. Relative indentation of later
|
|
||||||
lines in the docstring is retained. Any indentation on the first line
|
|
||||||
of the docstring (i.e., before the first newline) is removed.
|
|
||||||
|
|
||||||
Insert a blank line before and after all docstrings (one-line or
|
Insert a blank line before and after all docstrings (one-line or
|
||||||
multi-line) that document a class -- generally speaking, the class's
|
multi-line) that document a class -- generally speaking, the class's
|
||||||
|
@ -218,6 +212,76 @@ the closing quotes on a line by themselves. This way, Emacs'
|
||||||
``fill-paragraph`` command can be used on it.
|
``fill-paragraph`` command can be used on it.
|
||||||
|
|
||||||
|
|
||||||
|
Handling Docstring Indentation
|
||||||
|
------------------------------
|
||||||
|
|
||||||
|
Docstring processing tools will strip a uniform amount of indentation
|
||||||
|
from the second and further lines of the docstring, equal to the
|
||||||
|
minimum indentation of all non-blank lines after the first line. Any
|
||||||
|
indentation in the first line of the docstring (i.e., up to the first
|
||||||
|
newline) is insignificant and removed. Relative indentation of later
|
||||||
|
lines in the docstring is retained. Blank lines should be removed
|
||||||
|
from the beginning and end of the docstring.
|
||||||
|
|
||||||
|
Since code is much more precise than words, here is an implementation
|
||||||
|
of the algorithm::
|
||||||
|
|
||||||
|
def trim(docstring):
|
||||||
|
if not docstring:
|
||||||
|
return ''
|
||||||
|
# Convert tabs to spaces (following the normal Python rules)
|
||||||
|
# and split into a list of lines:
|
||||||
|
lines = docstring.expandtabs().splitlines()
|
||||||
|
# Determine minimum indentation (first line doesn't count):
|
||||||
|
indent = sys.maxint
|
||||||
|
for line in lines[1:]:
|
||||||
|
stripped = line.lstrip()
|
||||||
|
if stripped:
|
||||||
|
indent = min(indent, len(line) - len(stripped))
|
||||||
|
# Remove indentation (first line is special):
|
||||||
|
trimmed = [lines[0].strip()]
|
||||||
|
if indent < sys.maxint:
|
||||||
|
for line in lines[1:]:
|
||||||
|
trimmed.append(line[indent:].rstrip())
|
||||||
|
# Strip off trailing and leading blank lines:
|
||||||
|
while trimmed and not trimmed[-1]:
|
||||||
|
trimmed.pop()
|
||||||
|
while trimmed and not trimmed[0]:
|
||||||
|
trimmed.pop(0)
|
||||||
|
# Return a single string:
|
||||||
|
return '\n'.join(trimmed)
|
||||||
|
|
||||||
|
The docstring in this example contains two newline characters and is
|
||||||
|
therefore 3 lines long. The first and last lines are blank::
|
||||||
|
|
||||||
|
def foo():
|
||||||
|
"""
|
||||||
|
This is the second line of the docstring.
|
||||||
|
"""
|
||||||
|
|
||||||
|
To illustrate::
|
||||||
|
|
||||||
|
>>> print repr(foo.__doc__)
|
||||||
|
'\n This is the second line of the docstring.\n '
|
||||||
|
>>> foo.__doc__.splitlines()
|
||||||
|
['', ' This is the second line of the docstring.', ' ']
|
||||||
|
>>> trim(foo.__doc__)
|
||||||
|
'This is the second line of the docstring.'
|
||||||
|
|
||||||
|
Once trimmed, these docstrings are equivalent::
|
||||||
|
|
||||||
|
def foo():
|
||||||
|
"""A multi-line
|
||||||
|
docstring.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def bar():
|
||||||
|
"""
|
||||||
|
A multi-line
|
||||||
|
docstring.
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
References and Footnotes
|
References and Footnotes
|
||||||
========================
|
========================
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue