Napoleon -Marching toward legible docstrings¶
Note
As of Sphinx 1.3, the napoleon extension will come packaged withSphinx undersphinx.ext.napoleon. Thesphinxcontrib.napoleon extensionwill continue to work with Sphinx <= 1.2.
Are you tired of writing docstrings that look like this:
:param path: The path of the file to wrap:type path: str:param field_storage: The :class:`FileStorage` instance to wrap:type field_storage: FileStorage:param temporary: Whether or not to delete the file when the File instance is destructed:type temporary: bool:returns: A buffered writable file descriptor:rtype: BufferedFileStorage
ReStructuredText is great, but it creates visually dense, hard to readdocstrings. Compare the jumble above to the same thing rewrittenaccording to theGoogle Python Style Guide:
Args: path (str): The path of the file to wrap field_storage (FileStorage): The :class:`FileStorage` instance to wrap temporary (bool): Whether or not to delete the file when the File instance is destructedReturns: BufferedFileStorage: A buffered writable file descriptor
Much more legible, no?
Napoleon is aSphinx extension that enables Sphinx to parse bothNumPyandGoogle style docstrings - the style recommended byKhan Academy.
Napoleon is a pre-processor that parsesNumPy andGoogle styledocstrings and converts them to reStructuredText before Sphinx attempts toparse them. This happens in an intermediate step while Sphinx is processingthe documentation, so it doesn’t modify any of the docstrings in your actualsource code files.
Getting Started¶
Install the napoleon extension:
$ pip install sphinxcontrib-napoleon
Aftersetting up Sphinx to build your docs, enable napoleon in theSphinxconf.py file:
# conf.py# Add napoleon to the extensions listextensions=['sphinxcontrib.napoleon']
Usesphinx-apidoc to build your API documentation:
$ sphinx-apidoc -f -o docs/source projectdir
Docstrings¶
Napoleon interprets every docstring thatSphinx autodoc can find,including docstrings on:modules
,classes
,attributes
,methods
,functions
, andvariables
. Inside each docstring,specially formattedSections are parsed and converted toreStructuredText.
All standard reStructuredText formatting still works as expected.
Docstring Sections¶
All of the following section headers are supported:
Args
(alias of Parameters)Arguments
(alias of Parameters)Attributes
Example
Examples
KeywordArgs
(alias of Keyword Arguments)KeywordArguments
Methods
Note
Notes
OtherParameters
Parameters
Return
(alias of Returns)Returns
Raises
References
SeeAlso
Todo
Warning
Warnings
(alias of Warning)Warns
Yield
(alias of Yields)Yields
Google vs NumPy¶
Napoleon supports two styles of docstrings:Google andNumPy. Themain difference between the two styles is that Google uses indention toseparate sections, whereas NumPy uses underlines.
Google style:
deffunc(arg1,arg2):"""Summary line. Extended description of function. Args: arg1 (int): Description of arg1 arg2 (str): Description of arg2 Returns: bool: Description of return value """returnTrue
NumPy style:
deffunc(arg1,arg2):"""Summary line. Extended description of function. Parameters ---------- arg1 : int Description of arg1 arg2 : str Description of arg2 Returns ------- bool Description of return value """returnTrue
NumPy style tends to require more vertical space, whereas Google styletends to use more horizontal space. Google style tends to be easier toread for short and simple docstrings, whereas NumPy style tends be easierto read for long and in-depth docstrings.
TheKhan Academy recommends using Google style.
The choice between styles is largely aesthetic, but the two styles shouldnot be mixed. Choose one style for your project and be consistent with it.
See also
For complete examples:
Type Annotations¶
PEP 484 introduced a standard way to express types in Python code.This is an alternative to expressing types directly in docstrings.One benefit of expressing types according toPEP 484 is thattype checkers and IDEs can take advantage of them for static codeanalysis.
Google style with Python 3 type annotations:
deffunc(arg1:int,arg2:str)->bool:"""Summary line. Extended description of function. Args: arg1: Description of arg1 arg2: Description of arg2 Returns: Description of return value """returnTrue
Google style with types in docstrings:
deffunc(arg1,arg2):"""Summary line. Extended description of function. Args: arg1 (int): Description of arg1 arg2 (str): Description of arg2 Returns: bool: Description of return value """returnTrue
Note
Python 2/3 compatible annotations aren’t currentlysupported by Sphinx and won’t show up in the docs.
Configuration¶
For detailed configuration options seesphinxcontrib.napoleon.Config
.