Manual:Coding conventions/Python

This page describes the coding conventions for Python projects that are a part of the MediaWiki project or supporting projects.

Preamble
First, remember that code standards are only guidelines and can be violated if there is a good reason.


 * Aim for readability and obviousness over strict adherence for the sake of strict adherence.
 * Code is read much more often than it is written.
 * Be consistent with existing code, but use your best judgement. If it isn't too hard to fix up the existing code, be bold.

For anything not covered in this document, please refer to [ http://www.python.org/dev/peps/pep-0008/ Python Enhancement Proposal 0008] for the general practice. The following sections are for the most part a summary of the most commonly referred to parts of PEP8.

Python version
The minimum supported version is 2.7, but in special cases it is okay to support older versions.

If you have not already, you should change to Python 3 for local development.

Whitespace
Lines should be indented with 4 spaces.

Lines at the end of files should end with a newline, just like every other line in the file.

Try to keep lines under 80 characters long, but aim for readability and obviousness over strict adherence for the sake of strict adherence. Shorter lines are just a general side effect of good idiomatic Python - short but properly scoped descriptive names, avoiding [ http://stackoverflow.com/questions/4975457/python-preventing-if-staircases staircase code], etc. When splitting up lines, pick the most obviously unambiguous method possible for the situation.

Module structure
The standard way to distribute Python modules is to create a  file and leverage a library called "distribute". There are modules that will generate the structure of a base project for you, a deprecated one is  which is no longer maintained. A replacement is [ https://pypi.python.org/pypi/pythong pythong].

In general module structure should look like this:

newproject ├── bin ├── distribute_setup.py ├── docs ├── newproject │    └── __init__.py ├── setup.py └── tests ├── __init__.py      └── newproject_tests.py

Imports
Within a file it's generally a good idea to organize your imports in some fashion. Typically alphabetical order is favored, but this can become unwieldy when importing a large number of libraries. To help avoid this, it's good to separate out imports in this fashion, with each block separated from the others by an empty line:


 * Standard library imports
 * Third party imports
 * Your library imports

Here are some patterns to avoid:

Imports expanded example
Here is a more detailed abstracted version (the comments are just for explanation purposes):

Docstrings and function annotation
Generally all but the simplest functions should have docstrings. These are standardized in [ http://www.python.org/dev/peps/pep-0257/#multi-line-docstrings PEP 257]

This makes it possible to automatically generate docs, as well as use Python's built-in function.

In Python 3.3 and above PEP 3107 specifies syntax for function annotations.

Function annotations do not have a completely set use case, but a common emerging case is for improved help docs and for type annotation.

Naming conflicts
Conflicting with builtins is a somewhat common problem. There are some builtin names (like and  ) that you may want to use in your code. The PEP8 way to deal with these conflicts is by appending an underscore to the name, such as or  (although if you're naming a variable  that may be a code smell).

If you find yourself in conflict with the name of some part of another module, is your friend.