|
|
PEP: 287 |
|
|
Title: reStructuredText Docstring Format |
|
|
Version: $Revision: 4564 $ |
|
|
Last-Modified: $Date: 2006-05-21 22:44:42 +0200 (So, 21 Mai 2006) $ |
|
|
Author: David Goodger <goodger@python.org> |
|
|
Discussions-To: <doc-sig@python.org> |
|
|
Status: Draft |
|
|
Type: Informational |
|
|
Content-Type: text/x-rst |
|
|
Created: 25-Mar-2002 |
|
|
Post-History: 02-Apr-2002 |
|
|
Replaces: 216 |
|
|
|
|
|
|
|
|
Abstract |
|
|
======== |
|
|
|
|
|
When plaintext hasn't been expressive enough for inline documentation, |
|
|
Python programmers have sought out a format for docstrings. This PEP |
|
|
proposes that the `reStructuredText markup`_ be adopted as a standard |
|
|
markup format for structured plaintext documentation in Python |
|
|
docstrings, and for PEPs and ancillary documents as well. |
|
|
reStructuredText is a rich and extensible yet easy-to-read, |
|
|
what-you-see-is-what-you-get plaintext markup syntax. |
|
|
|
|
|
Only the low-level syntax of docstrings is addressed here. This PEP |
|
|
is not concerned with docstring semantics or processing at all (see |
|
|
PEP 256 for a "Road Map to the Docstring PEPs"). Nor is it an attempt |
|
|
to deprecate pure plaintext docstrings, which are always going to be |
|
|
legitimate. The reStructuredText markup is an alternative for those |
|
|
who want more expressive docstrings. |
|
|
|
|
|
|
|
|
Benefits |
|
|
======== |
|
|
|
|
|
Programmers are by nature a lazy breed. We reuse code with functions, |
|
|
classes, modules, and subsystems. Through its docstring syntax, |
|
|
Python allows us to document our code from within. The "holy grail" |
|
|
of the Python Documentation Special Interest Group (Doc-SIG_) has been |
|
|
a markup syntax and toolset to allow auto-documentation, where the |
|
|
docstrings of Python systems can be extracted in context and processed |
|
|
into useful, high-quality documentation for multiple purposes. |
|
|
|
|
|
Document markup languages have three groups of customers: the authors |
|
|
who write the documents, the software systems that process the data, |
|
|
and the readers, who are the final consumers and the most important |
|
|
group. Most markups are designed for the authors and software |
|
|
systems; readers are only meant to see the processed form, either on |
|
|
paper or via browser software. ReStructuredText is different: it is |
|
|
intended to be easily readable in source form, without prior knowledge |
|
|
of the markup. ReStructuredText is entirely readable in plaintext |
|
|
format, and many of the markup forms match common usage (e.g., |
|
|
``*emphasis*``), so it reads quite naturally. Yet it is rich enough |
|
|
to produce complex documents, and extensible so that there are few |
|
|
limits. Of course, to write reStructuredText documents some prior |
|
|
knowledge is required. |
|
|
|
|
|
The markup offers functionality and expressivity, while maintaining |
|
|
easy readability in the source text. The processed form (HTML etc.) |
|
|
makes it all accessible to readers: inline live hyperlinks; live links |
|
|
to and from footnotes; automatic tables of contents (with live |
|
|
links!); tables; images for diagrams etc.; pleasant, readable styled |
|
|
text. |
|
|
|
|
|
The reStructuredText parser is available now, part of the Docutils_ |
|
|
project. Standalone reStructuredText documents and PEPs can be |
|
|
converted to HTML; other output format writers are being worked on and |
|
|
will become available over time. Work is progressing on a Python |
|
|
source "Reader" which will implement auto-documentation from |
|
|
docstrings. Authors of existing auto-documentation tools are |
|
|
encouraged to integrate the reStructuredText parser into their |
|
|
projects, or better yet, to join forces to produce a world-class |
|
|
toolset for the Python standard library. |
|
|
|
|
|
Tools will become available in the near future, which will allow |
|
|
programmers to generate HTML for online help, XML for multiple |
|
|
purposes, and eventually PDF, DocBook, and LaTeX for printed |
|
|
documentation, essentially "for free" from the existing docstrings. |
|
|
The adoption of a standard will, at the very least, benefit docstring |
|
|
processing tools by preventing further "reinventing the wheel". |
|
|
|
|
|
Eventually PyDoc, the one existing standard auto-documentation tool, |
|
|
could have reStructuredText support added. In the interim it will |
|
|
have no problem with reStructuredText markup, since it treats all |
|
|
docstrings as preformatted plaintext. |
|
|
|
|
|
|
|
|
Goals |
|
|
===== |
|
|
|
|
|
These are the generally accepted goals for a docstring format, as |
|
|
discussed in the Doc-SIG: |
|
|
|
|
|
1. It must be readable in source form by the casual observer. |
|
|
|
|
|
2. It must be easy to type with any standard text editor. |
|
|
|
|
|
3. It must not need to contain information which can be deduced from |
|
|
parsing the module. |
|
|
|
|
|
4. It must contain sufficient information (structure) so it can be |
|
|
converted to any reasonable markup format. |
|
|
|
|
|
5. It must be possible to write a module's entire documentation in |
|
|
docstrings, without feeling hampered by the markup language. |
|
|
|
|
|
reStructuredText meets and exceeds all of these goals, and sets its |
|
|
own goals as well, even more stringent. See `Docstring-Significant |
|
|
Features`_ below. |
|
|
|
|
|
The goals of this PEP are as follows: |
|
|
|
|
|
1. To establish reStructuredText as a standard structured plaintext |
|
|
format for docstrings (inline documentation of Python modules and |
|
|
packages), PEPs, README-type files and other standalone documents. |
|
|
"Accepted" status will be sought through Python community consensus |
|
|
and eventual BDFL pronouncement. |
|
|
|
|
|
Please note that reStructuredText is being proposed as *a* |
|
|
standard, not *the only* standard. Its use will be entirely |
|
|
optional. Those who don't want to use it need not. |
|
|
|
|
|
2. To solicit and address any related concerns raised by the Python |
|
|
community. |
|
|
|
|
|
3. To encourage community support. As long as multiple competing |
|
|
markups are out there, the development community remains fractured. |
|
|
Once a standard exists, people will start to use it, and momentum |
|
|
will inevitably gather. |
|
|
|
|
|
4. To consolidate efforts from related auto-documentation projects. |
|
|
It is hoped that interested developers will join forces and work on |
|
|
a joint/merged/common implementation. |
|
|
|
|
|
Once reStructuredText is a Python standard, effort can be focused on |
|
|
tools instead of arguing for a standard. Python needs a standard set |
|
|
of documentation tools. |
|
|
|
|
|
With regard to PEPs, one or both of the following strategies may be |
|
|
applied: |
|
|
|
|
|
a) Keep the existing PEP section structure constructs (one-line |
|
|
section headers, indented body text). Subsections can either be |
|
|
forbidden, or supported with reStructuredText-style underlined |
|
|
headers in the indented body text. |
|
|
|
|
|
b) Replace the PEP section structure constructs with the |
|
|
reStructuredText syntax. Section headers will require underlines, |
|
|
subsections will be supported out of the box, and body text need |
|
|
not be indented (except for block quotes). |
|
|
|
|
|
Strategy (b) is recommended, and its implementation is complete. |
|
|
|
|
|
Support for RFC 2822 headers has been added to the reStructuredText |
|
|
parser for PEPs (unambiguous given a specific context: the first |
|
|
contiguous block of the document). It may be desired to concretely |
|
|
specify what over/underline styles are allowed for PEP section |
|
|
headers, for uniformity. |
|
|
|
|
|
|
|
|
Rationale |
|
|
========= |
|
|
|
|
|
The lack of a standard syntax for docstrings has hampered the |
|
|
development of standard tools for extracting and converting docstrings |
|
|
into documentation in standard formats (e.g., HTML, DocBook, TeX). |
|
|
There have been a number of proposed markup formats and variations, |
|
|
and many tools tied to these proposals, but without a standard |
|
|
docstring format they have failed to gain a strong following and/or |
|
|
floundered half-finished. |
|
|
|
|
|
Throughout the existence of the Doc-SIG, consensus on a single |
|
|
standard docstring format has never been reached. A lightweight, |
|
|
implicit markup has been sought, for the following reasons (among |
|
|
others): |
|
|
|
|
|
1. Docstrings written within Python code are available from within the |
|
|
interactive interpreter, and can be "print"ed. Thus the use of |
|
|
plaintext for easy readability. |
|
|
|
|
|
2. Programmers want to add structure to their docstrings, without |
|
|
sacrificing raw docstring readability. Unadorned plaintext cannot |
|
|
be transformed ("up-translated") into useful structured formats. |
|
|
|
|
|
3. Explicit markup (like XML or TeX) is widely considered unreadable |
|
|
by the uninitiated. |
|
|
|
|
|
4. Implicit markup is aesthetically compatible with the clean and |
|
|
minimalist Python syntax. |
|
|
|
|
|
Many alternative markups for docstrings have been proposed on the |
|
|
Doc-SIG over the years; a representative sample is listed below. Each |
|
|
is briefly analyzed in terms of the goals stated above. Please note |
|
|
that this is *not* intended to be an exclusive list of all existing |
|
|
markup systems; there are many other markups (Texinfo, Doxygen, TIM, |
|
|
YODL, AFT, ...) which are not mentioned. |
|
|
|
|
|
- XML_, SGML_, DocBook_, HTML_, XHTML_ |
|
|
|
|
|
XML and SGML are explicit, well-formed meta-languages suitable for |
|
|
all kinds of documentation. XML is a variant of SGML. They are |
|
|
best used behind the scenes, because to untrained eyes they are |
|
|
verbose, difficult to type, and too cluttered to read comfortably as |
|
|
source. DocBook, HTML, and XHTML are all applications of SGML |
|
|
and/or XML, and all share the same basic syntax and the same |
|
|
shortcomings. |
|
|
|
|
|
- TeX_ |
|
|
|
|
|
TeX is similar to XML/SGML in that it's explicit, but not very easy |
|
|
to write, and not easy for the uninitiated to read. |
|
|
|
|
|
- `Perl POD`_ |
|
|
|
|
|
Most Perl modules are documented in a format called POD (Plain Old |
|
|
Documentation). This is an easy-to-type, very low level format with |
|
|
strong integration with the Perl parser. Many tools exist to turn |
|
|
POD documentation into other formats: info, HTML and man pages, |
|
|
among others. However, the POD syntax takes after Perl itself in |
|
|
terms of readability. |
|
|
|
|
|
- JavaDoc_ |
|
|
|
|
|
Special comments before Java classes and functions serve to document |
|
|
the code. A program to extract these, and turn them into HTML |
|
|
documentation is called javadoc, and is part of the standard Java |
|
|
distribution. However, JavaDoc has a very intimate relationship |
|
|
with HTML, using HTML tags for most markup. Thus it shares the |
|
|
readability problems of HTML. |
|
|
|
|
|
- Setext_, StructuredText_ |
|
|
|
|
|
Early on, variants of Setext (Structure Enhanced Text), including |
|
|
Zope Corp's StructuredText, were proposed for Python docstring |
|
|
formatting. Hereafter these variants will collectively be called |
|
|
"STexts". STexts have the advantage of being easy to read without |
|
|
special knowledge, and relatively easy to write. |
|
|
|
|
|
Although used by some (including in most existing Python |
|
|
auto-documentation tools), until now STexts have failed to become |
|
|
standard because: |
|
|
|
|
|
- STexts have been incomplete. Lacking "essential" constructs that |
|
|
people want to use in their docstrings, STexts are rendered less |
|
|
than ideal. Note that these "essential" constructs are not |
|
|
universal; everyone has their own requirements. |
|
|
|
|
|
- STexts have been sometimes surprising. Bits of text are |
|
|
unexpectedly interpreted as being marked up, leading to user |
|
|
frustration. |
|
|
|
|
|
- SText implementations have been buggy. |
|
|
|
|
|
- Most STexts have have had no formal specification except for the |
|
|
implementation itself. A buggy implementation meant a buggy spec, |
|
|
and vice-versa. |
|
|
|
|
|
- There has been no mechanism to get around the SText markup rules |
|
|
when a markup character is used in a non-markup context. In other |
|
|
words, no way to escape markup. |
|
|
|
|
|
Proponents of implicit STexts have vigorously opposed proposals for |
|
|
explicit markup (XML, HTML, TeX, POD, etc.), and the debates have |
|
|
continued off and on since 1996 or earlier. |
|
|
|
|
|
reStructuredText is a complete revision and reinterpretation of the |
|
|
SText idea, addressing all of the problems listed above. |
|
|
|
|
|
|
|
|
Specification |
|
|
============= |
|
|
|
|
|
The specification and user documentaton for reStructuredText is |
|
|
quite extensive. Rather than repeating or summarizing it all |
|
|
here, links to the originals are provided. |
|
|
|
|
|
Please first take a look at `A ReStructuredText Primer`_, a short and |
|
|
gentle introduction. The `Quick reStructuredText`_ user reference |
|
|
quickly summarizes all of the markup constructs. For complete and |
|
|
extensive details, please refer to the following documents: |
|
|
|
|
|
- `An Introduction to reStructuredText`_ |
|
|
|
|
|
- `reStructuredText Markup Specification`_ |
|
|
|
|
|
- `reStructuredText Directives`_ |
|
|
|
|
|
In addition, `Problems With StructuredText`_ explains many markup |
|
|
decisions made with regards to StructuredText, and `A Record of |
|
|
reStructuredText Syntax Alternatives`_ records markup decisions made |
|
|
independently. |
|
|
|
|
|
|
|
|
Docstring-Significant Features |
|
|
============================== |
|
|
|
|
|
- A markup escaping mechanism. |
|
|
|
|
|
Backslashes (``\``) are used to escape markup characters when needed |
|
|
for non-markup purposes. However, the inline markup recognition |
|
|
rules have been constructed in order to minimize the need for |
|
|
backslash-escapes. For example, although asterisks are used for |
|
|
*emphasis*, in non-markup contexts such as "*" or "(*)" or "x * y", |
|
|
the asterisks are not interpreted as markup and are left unchanged. |
|
|
For many non-markup uses of backslashes (e.g., describing regular |
|
|
expressions), inline literals or literal blocks are applicable; see |
|
|
the next item. |
|
|
|
|
|
- Markup to include Python source code and Python interactive |
|
|
sessions: inline literals, literal blocks, and doctest blocks. |
|
|
|
|
|
Inline literals use ``double-backquotes`` to indicate program I/O or |
|
|
code snippets. No markup interpretation (including backslash-escape |
|
|
[``\``] interpretation) is done within inline literals. |
|
|
|
|
|
Literal blocks (block-level literal text, such as code excerpts or |
|
|
ASCII graphics) are indented, and indicated with a double-colon |
|
|
("::") at the end of the preceding paragraph (right here -->):: |
|
|
|
|
|
if literal_block: |
|
|
text = 'is left as-is' |
|
|
spaces_and_linebreaks = 'are preserved' |
|
|
markup_processing = None |
|
|
|
|
|
Doctest blocks begin with ">>> " and end with a blank line. Neither |
|
|
indentation nor literal block double-colons are required. For |
|
|
example:: |
|
|
|
|
|
Here's a doctest block: |
|
|
|
|
|
>>> print 'Python-specific usage examples; begun with ">>>"' |
|
|
Python-specific usage examples; begun with ">>>" |
|
|
>>> print '(cut and pasted from interactive sessions)' |
|
|
(cut and pasted from interactive sessions) |
|
|
|
|
|
- Markup that isolates a Python identifier: interpreted text. |
|
|
|
|
|
Text enclosed in single backquotes is recognized as "interpreted |
|
|
text", whose interpretation is application-dependent. In the |
|
|
context of a Python docstring, the default interpretation of |
|
|
interpreted text is as Python identifiers. The text will be marked |
|
|
up with a hyperlink connected to the documentation for the |
|
|
identifier given. Lookup rules are the same as in Python itself: |
|
|
LGB namespace lookups (local, global, builtin). The "role" of the |
|
|
interpreted text (identifying a class, module, function, etc.) is |
|
|
determined implicitly from the namespace lookup. For example:: |
|
|
|
|
|
class Keeper(Storer): |
|
|
|
|
|
""" |
|
|
Keep data fresher longer. |
|
|
|
|
|
Extend `Storer`. Class attribute `instances` keeps track |
|
|
of the number of `Keeper` objects instantiated. |
|
|
""" |
|
|
|
|
|
instances = 0 |
|
|
"""How many `Keeper` objects are there?""" |
|
|
|
|
|
def __init__(self): |
|
|
""" |
|
|
Extend `Storer.__init__()` to keep track of |
|
|
instances. Keep count in `self.instances` and data |
|
|
in `self.data`. |
|
|
""" |
|
|
Storer.__init__(self) |
|
|
self.instances += 1 |
|
|
|
|
|
self.data = [] |
|
|
"""Store data in a list, most recent last.""" |
|
|
|
|
|
def storedata(self, data): |
|
|
""" |
|
|
Extend `Storer.storedata()`; append new `data` to a |
|
|
list (in `self.data`). |
|
|
""" |
|
|
self.data = data |
|
|
|
|
|
Each piece of interpreted text is looked up according to the local |
|
|
namespace of the block containing its docstring. |
|
|
|
|
|
- Markup that isolates a Python identifier and specifies its type: |
|
|
interpreted text with roles. |
|
|
|
|
|
Although the Python source context reader is designed not to require |
|
|
explicit roles, they may be used. To classify identifiers |
|
|
explicitly, the role is given along with the identifier in either |
|
|
prefix or suffix form:: |
|
|
|
|
|
Use :method:`Keeper.storedata` to store the object's data in |
|
|
`Keeper.data`:instance_attribute:. |
|
|
|
|
|
The syntax chosen for roles is verbose, but necessarily so (if |
|
|
anyone has a better alternative, please post it to the Doc-SIG_). |
|
|
The intention of the markup is that there should be little need to |
|
|
use explicit roles; their use is to be kept to an absolute minimum. |
|
|
|
|
|
- Markup for "tagged lists" or "label lists": field lists. |
|
|
|
|
|
Field lists represent a mapping from field name to field body. |
|
|
These are mostly used for extension syntax, such as "bibliographic |
|
|
field lists" (representing document metadata such as author, date, |
|
|
and version) and extension attributes for directives (see below). |
|
|
They may be used to implement methodologies (docstring semantics), |
|
|
such as identifying parameters, exceptions raised, etc.; such usage |
|
|
is beyond the scope of this PEP. |
|
|
|
|
|
A modified RFC 2822 syntax is used, with a colon *before* as well as |
|
|
*after* the field name. Field bodies are more versatile as well; |
|
|
they may contain multiple field bodies (even nested field lists). |
|
|
For example:: |
|
|
|
|
|
:Date: 2002-03-22 |
|
|
:Version: 1 |
|
|
:Authors: |
|
|
- Me |
|
|
- Myself |
|
|
- I |
|
|
|
|
|
Standard RFC 2822 header syntax cannot be used for this construct |
|
|
because it is ambiguous. A word followed by a colon at the |
|
|
beginning of a line is common in written text. |
|
|
|
|
|
- Markup extensibility: directives and substitutions. |
|
|
|
|
|
Directives are used as an extension mechanism for reStructuredText, |
|
|
a way of adding support for new block-level constructs without |
|
|
adding new syntax. Directives for images, admonitions (note, |
|
|
caution, etc.), and tables of contents generation (among others) |
|
|
have been implemented. For example, here's how to place an image:: |
|
|
|
|
|
.. image:: mylogo.png |
|
|
|
|
|
Substitution definitions allow the power and flexibility of |
|
|
block-level directives to be shared by inline text. For example:: |
|
|
|
|
|
The |biohazard| symbol must be used on containers used to |
|
|
dispose of medical waste. |
|
|
|
|
|
.. |biohazard| image:: biohazard.png |
|
|
|
|
|
- Section structure markup. |
|
|
|
|
|
Section headers in reStructuredText use adornment via underlines |
|
|
(and possibly overlines) rather than indentation. For example:: |
|
|
|
|
|
This is a Section Title |
|
|
======================= |
|
|
|
|
|
This is a Subsection Title |
|
|
-------------------------- |
|
|
|
|
|
This paragraph is in the subsection. |
|
|
|
|
|
This is Another Section Title |
|
|
============================= |
|
|
|
|
|
This paragraph is in the second section. |
|
|
|
|
|
|
|
|
Questions & Answers |
|
|
=================== |
|
|
|
|
|
1. Is reStructuredText rich enough? |
|
|
|
|
|
Yes, it is for most people. If it lacks some construct that is |
|
|
required for a specific application, it can be added via the |
|
|
directive mechanism. If a useful and common construct has been |
|
|
overlooked and a suitably readable syntax can be found, it can be |
|
|
added to the specification and parser. |
|
|
|
|
|
2. Is reStructuredText *too* rich? |
|
|
|
|
|
For specific applications or individuals, perhaps. In general, no. |
|
|
|
|
|
Since the very beginning, whenever a docstring markup syntax has |
|
|
been proposed on the Doc-SIG_, someone has complained about the |
|
|
lack of support for some construct or other. The reply was often |
|
|
something like, "These are docstrings we're talking about, and |
|
|
docstrings shouldn't have complex markup." The problem is that a |
|
|
construct that seems superfluous to one person may be absolutely |
|
|
essential to another. |
|
|
|
|
|
reStructuredText takes the opposite approach: it provides a rich |
|
|
set of implicit markup constructs (plus a generic extension |
|
|
mechanism for explicit markup), allowing for all kinds of |
|
|
documents. If the set of constructs is too rich for a particular |
|
|
application, the unused constructs can either be removed from the |
|
|
parser (via application-specific overrides) or simply omitted by |
|
|
convention. |
|
|
|
|
|
3. Why not use indentation for section structure, like StructuredText |
|
|
does? Isn't it more "Pythonic"? |
|
|
|
|
|
Guido van Rossum wrote the following in a 2001-06-13 Doc-SIG post: |
|
|
|
|
|
I still think that using indentation to indicate sectioning is |
|
|
wrong. If you look at how real books and other print |
|
|
publications are laid out, you'll notice that indentation is |
|
|
used frequently, but mostly at the intra-section level. |
|
|
Indentation can be used to offset lists, tables, quotations, |
|
|
examples, and the like. (The argument that docstrings are |
|
|
different because they are input for a text formatter is wrong: |
|
|
the whole point is that they are also readable without |
|
|
processing.) |
|
|
|
|
|
I reject the argument that using indentation is Pythonic: text |
|
|
is not code, and different traditions and conventions hold. |
|
|
People have been presenting text for readability for over 30 |
|
|
centuries. Let's not innovate needlessly. |
|
|
|
|
|
See `Section Structure via Indentation`__ in `Problems With |
|
|
StructuredText`_ for further elaboration. |
|
|
|
|
|
__ http://docutils.sourceforge.net/docs/dev/rst/problems.html |
|
|
#section-structure-via-indentation |
|
|
|
|
|
4. Why use reStructuredText for PEPs? What's wrong with the existing |
|
|
standard? |
|
|
|
|
|
The existing standard for PEPs is very limited in terms of general |
|
|
expressibility, and referencing is especially lacking for such a |
|
|
reference-rich document type. PEPs are currently converted into |
|
|
HTML, but the results (mostly monospaced text) are less than |
|
|
attractive, and most of the value-added potential of HTML |
|
|
(especially inline hyperlinks) is untapped. |
|
|
|
|
|
Making reStructuredText a standard markup for PEPs will enable much |
|
|
richer expression, including support for section structure, inline |
|
|
markup, graphics, and tables. In several PEPs there are ASCII |
|
|
graphics diagrams, which are all that plaintext documents can |
|
|
support. Since PEPs are made available in HTML form, the ability |
|
|
to include proper diagrams would be immediately useful. |
|
|
|
|
|
Current PEP practices allow for reference markers in the form "[1]" |
|
|
in the text, and the footnotes/references themselves are listed in |
|
|
a section toward the end of the document. There is currently no |
|
|
hyperlinking between the reference marker and the |
|
|
footnote/reference itself (it would be possible to add this to |
|
|
pep2html.py, but the "markup" as it stands is ambiguous and |
|
|
mistakes would be inevitable). A PEP with many references (such as |
|
|
this one ;-) requires a lot of flipping back and forth. When |
|
|
revising a PEP, often new references are added or unused references |
|
|
deleted. It is painful to renumber the references, since it has to |
|
|
be done in two places and can have a cascading effect (insert a |
|
|
single new reference 1, and every other reference has to be |
|
|
renumbered; always adding new references to the end is suboptimal). |
|
|
It is easy for references to go out of sync. |
|
|
|
|
|
PEPs use references for two purposes: simple URL references and |
|
|
footnotes. reStructuredText differentiates between the two. A PEP |
|
|
might contain references like this:: |
|
|
|
|
|
Abstract |
|
|
|
|
|
This PEP proposes adding frungible doodads [1] to the core. |
|
|
It extends PEP 9876 [2] via the BCA [3] mechanism. |
|
|
|
|
|
... |
|
|
|
|
|
References and Footnotes |
|
|
|
|
|
[1] http://www.example.org/ |
|
|
|
|
|
[2] PEP 9876, Let's Hope We Never Get Here |
|
|
http://www.python.org/peps/pep-9876.html |
|
|
|
|
|
[3] "Bogus Complexity Addition" |
|
|
|
|
|
Reference 1 is a simple URL reference. Reference 2 is a footnote |
|
|
containing text and a URL. Reference 3 is a footnote containing |
|
|
text only. Rewritten using reStructuredText, this PEP could look |
|
|
like this:: |
|
|
|
|
|
Abstract |
|
|
======== |
|
|
|
|
|
This PEP proposes adding `frungible doodads`_ to the core. It |
|
|
extends PEP 9876 [#pep9876]_ via the BCA [#]_ mechanism. |
|
|
|
|
|
... |
|
|
|
|
|
References & Footnotes |
|
|
====================== |
|
|
|
|
|
.. _frungible doodads: http://www.example.org/ |
|
|
|
|
|
.. [#pep9876] PEP 9876, Let's Hope We Never Get Here |
|
|
|
|
|
.. [#] "Bogus Complexity Addition" |
|
|
|
|
|
URLs and footnotes can be defined close to their references if |
|
|
desired, making them easier to read in the source text, and making |
|
|
the PEPs easier to revise. The "References and Footnotes" section |
|
|
can be auto-generated with a document tree transform. Footnotes |
|
|
from throughout the PEP would be gathered and displayed under a |
|
|
standard header. If URL references should likewise be written out |
|
|
explicitly (in citation form), another tree transform could be |
|
|
used. |
|
|
|
|
|
URL references can be named ("frungible doodads"), and can be |
|
|
referenced from multiple places in the document without additional |
|
|
definitions. When converted to HTML, references will be replaced |
|
|
with inline hyperlinks (HTML <a> tags). The two footnotes are |
|
|
automatically numbered, so they will always stay in sync. The |
|
|
first footnote also contains an internal reference name, "pep9876", |
|
|
so it's easier to see the connection between reference and footnote |
|
|
in the source text. Named footnotes can be referenced multiple |
|
|
times, maintaining consistent numbering. |
|
|
|
|
|
The "#pep9876" footnote could also be written in the form of a |
|
|
citation:: |
|
|
|
|
|
It extends PEP 9876 [PEP9876]_ ... |
|
|
|
|
|
.. [PEP9876] PEP 9876, Let's Hope We Never Get Here |
|
|
|
|
|
Footnotes are numbered, whereas citations use text for their |
|
|
references. |
|
|
|
|
|
5. Wouldn't it be better to keep the docstring and PEP proposals |
|
|
separate? |
|
|
|
|
|
The PEP markup proposal may be removed if it is deemed that there |
|
|
is no need for PEP markup, or it could be made into a separate PEP. |
|
|
If accepted, PEP 1, PEP Purpose and Guidelines [#PEP-1]_, and PEP |
|
|
9, Sample PEP Template [#PEP-9]_ will be updated. |
|
|
|
|
|
It seems natural to adopt a single consistent markup standard for |
|
|
all uses of structured plaintext in Python, and to propose it all |
|
|
in one place. |
|
|
|
|
|
6. The existing pep2html.py script converts the existing PEP format to |
|
|
HTML. How will the new-format PEPs be converted to HTML? |
|
|
|
|
|
A new version of pep2html.py with integrated reStructuredText |
|
|
parsing has been completed. The Docutils project supports PEPs |
|
|
with a "PEP Reader" component, including all functionality |
|
|
currently in pep2html.py (auto-recognition of PEP & RFC references, |
|
|
email masking, etc.). |
|
|
|
|
|
7. Who's going to convert the existing PEPs to reStructuredText? |
|
|
|
|
|
PEP authors or volunteers may convert existing PEPs if they like, |
|
|
but there is no requirement to do so. The reStructuredText-based |
|
|
PEPs will coexist with the old PEP standard. The pep2html.py |
|
|
mentioned in answer 6 processes both old and new standards. |
|
|
|
|
|
8. Why use reStructuredText for README and other ancillary files? |
|
|
|
|
|
The reasoning given for PEPs in answer 4 above also applies to |
|
|
README and other ancillary files. By adopting a standard markup, |
|
|
these files can be converted to attractive cross-referenced HTML |
|
|
and put up on python.org. Developers of other projects can also |
|
|
take advantage of this facility for their own documentation. |
|
|
|
|
|
9. Won't the superficial similarity to existing markup conventions |
|
|
cause problems, and result in people writing invalid markup (and |
|
|
not noticing, because the plaintext looks natural)? How forgiving |
|
|
is reStructuredText of "not quite right" markup? |
|
|
|
|
|
There will be some mis-steps, as there would be when moving from |
|
|
one programming language to another. As with any language, |
|
|
proficiency grows with experience. Luckily, reStructuredText is a |
|
|
very little language indeed. |
|
|
|
|
|
As with any syntax, there is the possibility of syntax errors. It |
|
|
is expected that a user will run the processing system over their |
|
|
input and check the output for correctness. |
|
|
|
|
|
In a strict sense, the reStructuredText parser is very unforgiving |
|
|
(as it should be; "In the face of ambiguity, refuse the temptation |
|
|
to guess" [#Zen]_ applies to parsing markup as well as computer |
|
|
languages). Here's design goal 3 from `An Introduction to |
|
|
reStructuredText`_: |
|
|
|
|
|
Unambiguous. The rules for markup must not be open for |
|
|
interpretation. For any given input, there should be one and |
|
|
only one possible output (including error output). |
|
|
|
|
|
While unforgiving, at the same time the parser does try to be |
|
|
helpful by producing useful diagnostic output ("system messages"). |
|
|
The parser reports problems, indicating their level of severity |
|
|
(from least to most: debug, info, warning, error, severe). The |
|
|
user or the client software can decide on reporting thresholds; |
|
|
they can ignore low-level problems or cause high-level problems to |
|
|
bring processing to an immediate halt. Problems are reported |
|
|
during the parse as well as included in the output, often with |
|
|
two-way links between the source of the problem and the system |
|
|
message explaining it. |
|
|
|
|
|
10. Will the docstrings in the Python standard library modules be |
|
|
converted to reStructuredText? |
|
|
|
|
|
No. Python's library reference documentation is maintained |
|
|
separately from the source. Docstrings in the Python standard |
|
|
library should not try to duplicate the library reference |
|
|
documentation. The current policy for docstrings in the Python |
|
|
standard library is that they should be no more than concise |
|
|
hints, simple and markup-free (although many *do* contain ad-hoc |
|
|
implicit markup). |
|
|
|
|
|
11. I want to write all my strings in Unicode. Will anything |
|
|
break? |
|
|
|
|
|
The parser fully supports Unicode. Docutils supports arbitrary |
|
|
input and output encodings. |
|
|
|
|
|
12. Why does the community need a new structured text design? |
|
|
|
|
|
The existing structured text designs are deficient, for the |
|
|
reasons given in "Rationale" above. reStructuredText aims to be a |
|
|
complete markup syntax, within the limitations of the "readable |
|
|
plaintext" medium. |
|
|
|
|
|
13. What is wrong with existing documentation methodologies? |
|
|
|
|
|
What existing methodologies? For Python docstrings, there is |
|
|
**no** official standard markup format, let alone a documentation |
|
|
methodology akin to JavaDoc. The question of methodology is at a |
|
|
much higher level than syntax (which this PEP addresses). It is |
|
|
potentially much more controversial and difficult to resolve, and |
|
|
is intentionally left out of this discussion. |
|
|
|
|
|
|
|
|
References & Footnotes |
|
|
====================== |
|
|
|
|
|
.. [#PEP-1] PEP 1, PEP Guidelines, Warsaw, Hylton |
|
|
(http://www.python.org/peps/pep-0001.html) |
|
|
|
|
|
.. [#PEP-9] PEP 9, Sample PEP Template, Warsaw |
|
|
(http://www.python.org/peps/pep-0009.html) |
|
|
|
|
|
.. [#Zen] From `The Zen of Python (by Tim Peters)`__ (or just |
|
|
"``import this``" in Python) |
|
|
|
|
|
__ http://www.python.org/doc/Humor.html#zen |
|
|
|
|
|
.. [#PEP-216] PEP 216, Docstring Format, Zadka |
|
|
(http://www.python.org/peps/pep-0216.html) |
|
|
|
|
|
.. _reStructuredText markup: http://docutils.sourceforge.net/rst.html |
|
|
|
|
|
.. _Doc-SIG: http://www.python.org/sigs/doc-sig/ |
|
|
|
|
|
.. _XML: http://www.w3.org/XML/ |
|
|
|
|
|
.. _SGML: http://www.oasis-open.org/cover/general.html |
|
|
|
|
|
.. _DocBook: http://docbook.org/tdg/en/html/docbook.html |
|
|
|
|
|
.. _HTML: http://www.w3.org/MarkUp/ |
|
|
|
|
|
.. _XHTML: http://www.w3.org/MarkUp/#xhtml1 |
|
|
|
|
|
.. _TeX: http://www.tug.org/interest.html |
|
|
|
|
|
.. _Perl POD: http://perldoc.perl.org/perlpod.html |
|
|
|
|
|
.. _JavaDoc: http://java.sun.com/j2se/javadoc/ |
|
|
|
|
|
.. _Setext: http://docutils.sourceforge.net/mirror/setext.html |
|
|
|
|
|
.. _StructuredText: |
|
|
http://www.zope.org/DevHome/Members/jim/StructuredTextWiki/FrontPage |
|
|
|
|
|
.. _A ReStructuredText Primer: |
|
|
http://docutils.sourceforge.net/docs/user/rst/quickstart.html |
|
|
|
|
|
.. _Quick reStructuredText: |
|
|
http://docutils.sourceforge.net/docs/user/rst/quickref.html |
|
|
|
|
|
.. _An Introduction to reStructuredText: |
|
|
http://docutils.sourceforge.net/docs/ref/rst/introduction.html |
|
|
|
|
|
.. _reStructuredText Markup Specification: |
|
|
http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html |
|
|
|
|
|
.. _reStructuredText Directives: |
|
|
http://docutils.sourceforge.net/docs/ref/rst/directives.html |
|
|
|
|
|
.. _Problems with StructuredText: |
|
|
http://docutils.sourceforge.net/docs/dev/rst/problems.html |
|
|
|
|
|
.. _A Record of reStructuredText Syntax Alternatives: |
|
|
http://docutils.sourceforge.net/docs/dev/rst/alternatives.html |
|
|
|
|
|
.. _Docutils: http://docutils.sourceforge.net/ |
|
|
|
|
|
|
|
|
Copyright |
|
|
========= |
|
|
|
|
|
This document has been placed in the public domain. |
|
|
|
|
|
|
|
|
Acknowledgements |
|
|
================ |
|
|
|
|
|
Some text is borrowed from PEP 216, Docstring Format [#PEP-216]_, by |
|
|
Moshe Zadka. |
|
|
|
|
|
Special thanks to all members past & present of the Python Doc-SIG_. |
|
|
|
|
|
|
|
|
|
|
|
.. |
|
|
Local Variables: |
|
|
mode: indented-text |
|
|
indent-tabs-mode: nil |
|
|
sentence-end-double-space: t |
|
|
fill-column: 70 |
|
|
End:
|
|
|
|