Documentation in Python

Writing is an important job not just for writers, but also for researchers and developers. Your academic findings will not be particularly useful if no one else has access to them, or can not understand them. Similarly, if you develop some great new piece of software to solve some problem, but don’t document and distribute it, then no one will use it.

Clear communication and documentation are crucial aspects of scientific computing. We’ll take a quick look at how this manifests in Python, and given enough time, we’ll return to the topic later.

Documentation suitable for the web

The internet is the most common hub for the distribution of software. Similarly, it is the most common place to provide support and host documentation. However, developing for the web requires a skill set that is largely orthogonal to that of scientific computing. Without a few key tools, hosting online documentation could be even more cumbersome than developing the software itself!

One nice tool for this, particularly for Python, is Sphinx. This tool supports many languages other than just Python. It falls into the class of static site generators.

This whole website was created using Sphinx and reStructuredText (discussed below).

Markdown

The Markdown language can be an antidote for these problems. Markdown is not a programming language, but rather a formatting standard on plain text. The main goal of Markdown is to write an easy to read document “as-is”, that can alse be converted into HTML, or other fancier formats, easily and unambiguously. Consider this sample document:

Heading
=======

## This is a sub-heading

### This is a sub-sub-heading

This is a paragraph. If you want to make
another one, just make a blank line.

This is a second paragraph. The new line
will be ignored,
but if you want to make it by force,
just make two spaces
at the end of the line.

You can make an *italic*, **bold** or `monospace` texts.

This is a bullet list

  * apples
  * oranges
  * pears

And numbered list:

  1. wash
  2. rinse
  3. repeat

A [link](http://example.com).

![Image](Image_icon.png)

Now, its way better. The Markdown text is very easy to read, and easy to write. Also, since the Markdown text is just a plain text, it is a very portable format which can be imported to other programs or services easily. For example, most of the popular remote hosts for git repositories support README’s written in markdown. This makes them simultaneously simple plaintext files (which is good for git), and allows fancy rendering when on the website. Typically this is achieved by naming it README.md.

In other settings, publishing your markdown document on the web requires you to convert the markdown file into HTML. By writing a markdown document you won’t need to think about the final HTML syntax (or whatever format you choose).

reStructuredText

reStructuredText is another markup language, which widely used on the Python community to document Python projects. For example, the Python documentation pages were written in reStructuredText and processed with Sphinx.

Note

These AM 129 lecture notes are also created in this way

The basic syntax for reStructuredText is very similar to markdown.

===============
This is a title
===============

This is the first section
-------------------------

This is a paragraph. New lines
will be ignored, and words will wrap according to whatever other
formats are converted to. You can start another paragraph

by making a blank line. You can write in
*italic*, **bold**, `monospace` text.

bullet list:

   * apple
   * oranges
   * pears

And numbered list:

   #. wash
   #. rinse
   #. repeat

A `link <http://example.com>`_.

At a glance, the differences between markdown and reStructuredText are hardly noticeable. Broadly speaking, markdown is useful primarily for targeting the web, with other output formats being more of an afterthought. reStructuredText is a little more friendly to technical writing, and has more natural support for things like mathematical expressions using LaTex.

To read more on the differences between markdown and reStructuredText, refer to this article.

Conversion tools

You can convert markdown or reStructuredText into a variety of other formats, in particular as statically generated websites. There are many tools, such as pandoc, docutils, sphinx or pelican.

Sphinx, the tool that has been used for making these online lecture notes, can generate a static website from a set of markdown or reStructuredText files. To make a Sphinx web page, you first need to install the Sphinx package.

$ pip install sphinx

Sphinx is a Python package, so you’ll need to use pip to install it. Let’s use Sphinx to create a simple website. Open your terminal and navigate to a directory where you would like to store your website and the associated sources. Then you can run:

$ sphinx-quickstart

upon which you will see questions regarding the initial configuration that you’ll need to answer. This will create a source directory with conf.py and a master document called index.rst. Don’t know what to answer? Don’t be afraid, there are default answers at the end of the questions, and you can always go with them first and fix them later by editing the conf.py file.

If you open index.rst file you should see something similar to:

.. test documentation master file, created by
   sphinx-quickstart on Thu Oct 31 00:45:12 2030.
   You can adapt this file completely to your liking, but it should at least
   contain the root `toctree` directive.

Welcome to test's documentation!
================================

.. toctree::
   :maxdepth: 2
   :caption: Contents:

Indices and tables
==================

* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`

This reStructuredText file will get processed into the landing page for your website. To have Sphinx process this into a statically generated HTML site you can run:

$ make html

Then, Sphinx will generate some HTML files in _build/html directory. If you open the index.html file on your web browser (such as Chrome, Safari or Firefox) then you can see a web-formatted document.