2001-07-05 14:56:12 -04:00
|
|
|
|
PEP: 8
|
|
|
|
|
Title: Style Guide for Python Code
|
|
|
|
|
Version: $Revision$
|
2006-03-23 15:13:19 -05:00
|
|
|
|
Last-Modified: $Date$
|
2001-07-05 14:56:12 -04:00
|
|
|
|
Author: guido@python.org (Guido van Rossum),
|
2003-09-22 00:51:50 -04:00
|
|
|
|
barry@python.org (Barry Warsaw)
|
2001-07-05 14:56:12 -04:00
|
|
|
|
Status: Active
|
2007-06-19 00:52:34 -04:00
|
|
|
|
Type: Process
|
2001-07-05 14:56:12 -04:00
|
|
|
|
Created: 05-Jul-2001
|
2001-07-05 14:56:34 -04:00
|
|
|
|
Post-History: 05-Jul-2001
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Introduction
|
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
This document gives coding conventions for the Python code comprising the
|
|
|
|
|
standard library in the main Python distribution. Please see the
|
|
|
|
|
companion informational PEP describing style guidelines for the C code in
|
|
|
|
|
the C implementation of Python[1].
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
This document was adapted from Guido's original Python Style Guide
|
|
|
|
|
essay[2], with some additions from Barry's style guide[5]. Where there's
|
|
|
|
|
conflict, Guido's style rules for the purposes of this PEP. This PEP may
|
|
|
|
|
still be incomplete (in fact, it may never be finished <wink>).
|
2001-07-05 16:38:11 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
A Foolish Consistency is the Hobgoblin of Little Minds
|
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
One of Guido's key insights is that code is read much more often than it
|
|
|
|
|
is written. The guidelines provided here are intended to improve the
|
|
|
|
|
readability of code and make it consistent across the wide spectrum of
|
|
|
|
|
Python code. As PEP 20 [6] says, "Readability counts".
|
2001-07-05 16:38:11 -04:00
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
A style guide is about consistency. Consistency with this style guide is
|
|
|
|
|
important. Consistency within a project is more important. Consistency
|
|
|
|
|
within one module or function is most important.
|
|
|
|
|
|
|
|
|
|
But most importantly: know when to be inconsistent -- sometimes the style
|
|
|
|
|
guide just doesn't apply. When in doubt, use your best judgment. Look
|
|
|
|
|
at other examples and decide what looks best. And don't hesitate to ask!
|
2001-07-05 16:38:11 -04:00
|
|
|
|
|
|
|
|
|
Two good reasons to break a particular rule:
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
(1) When applying the rule would make the code less readable, even for
|
|
|
|
|
someone who is used to reading code that follows the rules.
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
(2) To be consistent with surrounding code that also breaks it (maybe for
|
|
|
|
|
historic reasons) -- although this is also an opportunity to clean up
|
|
|
|
|
someone else's mess (in true XP style).
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Code lay-out
|
|
|
|
|
|
|
|
|
|
Indentation
|
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
Use 4 spaces per indentation level.
|
|
|
|
|
|
2005-12-15 10:44:35 -05:00
|
|
|
|
For really old code that you don't want to mess up, you can continue to
|
|
|
|
|
use 8-space tabs.
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2011-06-13 12:48:33 -04:00
|
|
|
|
Continuation lines should align wrapped elements either vertically using
|
|
|
|
|
Python's implicit line joining inside parentheses, brackets and braces, or
|
|
|
|
|
using a hanging indent. When using a hanging indent the following
|
|
|
|
|
considerations should be applied; there should be no arguments on the
|
|
|
|
|
first line and further indentation should be used to clearly distinguish
|
|
|
|
|
itself as a continuation line.
|
2011-06-02 14:09:20 -04:00
|
|
|
|
|
|
|
|
|
Yes: # Aligned with opening delimiter
|
|
|
|
|
foo = long_function_name(var_one, var_two,
|
|
|
|
|
var_three, var_four)
|
|
|
|
|
|
2011-06-13 12:48:33 -04:00
|
|
|
|
# More indentation included to distinguish this from the rest.
|
|
|
|
|
def long_function_name(
|
2011-06-02 14:09:20 -04:00
|
|
|
|
var_one, var_two, var_three,
|
2011-06-13 12:48:33 -04:00
|
|
|
|
var_four):
|
|
|
|
|
print(var_one)
|
2011-06-02 14:09:20 -04:00
|
|
|
|
|
2011-06-13 12:48:33 -04:00
|
|
|
|
No: # Arguments on first line forbidden when not using vertical alignment
|
2011-06-02 14:09:20 -04:00
|
|
|
|
foo = long_function_name(var_one, var_two,
|
|
|
|
|
var_three, var_four)
|
|
|
|
|
|
2011-06-13 12:48:33 -04:00
|
|
|
|
# Further indentation required as indentation is not distinguishable
|
|
|
|
|
def long_function_name(
|
|
|
|
|
var_one, var_two, var_three,
|
|
|
|
|
var_four):
|
|
|
|
|
print(var_one)
|
|
|
|
|
|
|
|
|
|
Optional:
|
|
|
|
|
# Extra indentation is not necessary.
|
2011-06-02 14:09:20 -04:00
|
|
|
|
foo = long_function_name(
|
2011-06-13 12:48:33 -04:00
|
|
|
|
var_one, var_two,
|
|
|
|
|
var_three, var_four)
|
2011-06-02 14:09:20 -04:00
|
|
|
|
|
2001-07-05 14:56:12 -04:00
|
|
|
|
Tabs or Spaces?
|
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
Never mix tabs and spaces.
|
|
|
|
|
|
|
|
|
|
The most popular way of indenting Python is with spaces only. The
|
|
|
|
|
second-most popular way is with tabs only. Code indented with a mixture
|
2005-12-15 10:44:35 -05:00
|
|
|
|
of tabs and spaces should be converted to using spaces exclusively. When
|
|
|
|
|
invoking the Python command line interpreter with the -t option, it issues
|
|
|
|
|
warnings about code that illegally mixes tabs and spaces. When using -tt
|
|
|
|
|
these warnings become errors. These options are highly recommended!
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
For new projects, spaces-only are strongly recommended over tabs. Most
|
2005-12-15 10:44:35 -05:00
|
|
|
|
editors have features that make this easy to do.
|
2002-05-24 11:01:43 -04:00
|
|
|
|
|
2001-07-05 14:56:12 -04:00
|
|
|
|
Maximum Line Length
|
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
Limit all lines to a maximum of 79 characters.
|
|
|
|
|
|
|
|
|
|
There are still many devices around that are limited to 80 character
|
|
|
|
|
lines; plus, limiting windows to 80 characters makes it possible to have
|
2008-02-21 11:21:15 -05:00
|
|
|
|
several windows side-by-side. The default wrapping on such devices
|
|
|
|
|
disrupts the visual structure of the code, making it more difficult to
|
|
|
|
|
understand. Therefore, please limit all lines to a maximum of 79
|
|
|
|
|
characters. For flowing long blocks of text (docstrings or comments),
|
|
|
|
|
limiting the length to 72 characters is recommended.
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
|
|
|
|
The preferred way of wrapping long lines is by using Python's implied line
|
2010-11-28 14:45:15 -05:00
|
|
|
|
continuation inside parentheses, brackets and braces. Long lines can be
|
|
|
|
|
broken over multiple lines by wrapping expressions in parentheses. These
|
2011-02-09 01:50:14 -05:00
|
|
|
|
should be used in preference to using a backslash for line continuation.
|
2010-11-28 14:45:15 -05:00
|
|
|
|
Make sure to indent the continued line appropriately. The preferred place
|
2011-02-09 01:50:14 -05:00
|
|
|
|
to break around a binary operator is *after* the operator, not before it.
|
2010-11-28 14:45:15 -05:00
|
|
|
|
Some examples:
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
|
|
|
|
class Rectangle(Blob):
|
|
|
|
|
|
|
|
|
|
def __init__(self, width, height,
|
|
|
|
|
color='black', emphasis=None, highlight=0):
|
2010-11-28 14:45:15 -05:00
|
|
|
|
if (width == 0 and height == 0 and
|
|
|
|
|
color == 'red' and emphasis == 'strong' or
|
|
|
|
|
highlight > 100):
|
2005-08-20 09:48:50 -04:00
|
|
|
|
raise ValueError("sorry, you lose")
|
2001-07-05 14:56:12 -04:00
|
|
|
|
if width == 0 and height == 0 and (color == 'red' or
|
|
|
|
|
emphasis is None):
|
2008-06-06 14:48:49 -04:00
|
|
|
|
raise ValueError("I don't think so -- values are %s, %s" %
|
|
|
|
|
(width, height))
|
2001-07-05 14:56:12 -04:00
|
|
|
|
Blob.__init__(self, width, height,
|
|
|
|
|
color, emphasis, highlight)
|
|
|
|
|
|
|
|
|
|
Blank Lines
|
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
Separate top-level function and class definitions with two blank lines.
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
Method definitions inside a class are separated by a single blank line.
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
Extra blank lines may be used (sparingly) to separate groups of related
|
|
|
|
|
functions. Blank lines may be omitted between a bunch of related
|
|
|
|
|
one-liners (e.g. a set of dummy implementations).
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
Use blank lines in functions, sparingly, to indicate logical sections.
|
|
|
|
|
|
|
|
|
|
Python accepts the control-L (i.e. ^L) form feed character as whitespace;
|
2005-12-15 10:44:35 -05:00
|
|
|
|
Many tools treat these characters as page separators, so you may use them
|
2011-02-09 01:50:14 -05:00
|
|
|
|
to separate pages of related sections of your file. Note, some editors
|
|
|
|
|
and web-based code viewers may not recognize control-L as a form feed
|
|
|
|
|
and will show another glyph in its place.
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2002-10-07 09:40:41 -04:00
|
|
|
|
Encodings (PEP 263)
|
|
|
|
|
|
2011-02-17 18:12:04 -05:00
|
|
|
|
Code in the core Python distribution should always use the ASCII or
|
2007-05-17 12:48:09 -04:00
|
|
|
|
Latin-1 encoding (a.k.a. ISO-8859-1). For Python 3.0 and beyond,
|
|
|
|
|
UTF-8 is preferred over Latin-1, see PEP 3120.
|
|
|
|
|
|
2010-08-29 15:54:09 -04:00
|
|
|
|
Files using ASCII should not have a coding cookie. Latin-1 (or
|
|
|
|
|
UTF-8) should only be used when a comment or docstring needs to
|
|
|
|
|
mention an author name that requires Latin-1; otherwise, using
|
|
|
|
|
\x, \u or \U escapes is the preferred way to include non-ASCII
|
|
|
|
|
data in string literals.
|
2007-05-17 12:48:09 -04:00
|
|
|
|
|
|
|
|
|
For Python 3.0 and beyond, the following policy is prescribed for
|
|
|
|
|
the standard library (see PEP 3131): All identifiers in the Python
|
|
|
|
|
standard library MUST use ASCII-only identifiers, and SHOULD use
|
|
|
|
|
English words wherever feasible (in many cases, abbreviations and
|
|
|
|
|
technical terms are used which aren't English). In addition,
|
|
|
|
|
string literals and comments must also be in ASCII. The only
|
|
|
|
|
exceptions are (a) test cases testing the non-ASCII features, and
|
|
|
|
|
(b) names of authors. Authors whose names are not based on the
|
|
|
|
|
latin alphabet MUST provide a latin transliteration of their
|
|
|
|
|
names.
|
|
|
|
|
|
|
|
|
|
Open source projects with a global audience are encouraged to
|
|
|
|
|
adopt a similar policy.
|
2002-10-07 09:40:41 -04:00
|
|
|
|
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2002-05-24 12:22:16 -04:00
|
|
|
|
Imports
|
|
|
|
|
|
|
|
|
|
- Imports should usually be on separate lines, e.g.:
|
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
Yes: import os
|
|
|
|
|
import sys
|
|
|
|
|
|
2002-05-24 12:22:16 -04:00
|
|
|
|
No: import sys, os
|
|
|
|
|
|
|
|
|
|
it's okay to say this though:
|
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
from subprocess import Popen, PIPE
|
2002-05-24 12:22:16 -04:00
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
- Imports are always put at the top of the file, just after any module
|
|
|
|
|
comments and docstrings, and before module globals and constants.
|
|
|
|
|
|
|
|
|
|
Imports should be grouped in the following order:
|
2002-05-24 12:22:16 -04:00
|
|
|
|
|
|
|
|
|
1. standard library imports
|
2005-12-14 16:12:58 -05:00
|
|
|
|
2. related third party imports
|
|
|
|
|
3. local application/library specific imports
|
2002-05-24 12:22:16 -04:00
|
|
|
|
|
|
|
|
|
You should put a blank line between each group of imports.
|
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
Put any relevant __all__ specification after the imports.
|
|
|
|
|
|
|
|
|
|
- Relative imports for intra-package imports are highly discouraged.
|
|
|
|
|
Always use the absolute package path for all imports.
|
2006-03-15 17:47:10 -05:00
|
|
|
|
Even now that PEP 328 [7] is fully implemented in Python 2.5,
|
|
|
|
|
its style of explicit relative imports is actively discouraged;
|
|
|
|
|
absolute imports are more portable and usually more readable.
|
2002-05-24 12:22:16 -04:00
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
- When importing a class from a class-containing module, it's usually okay
|
|
|
|
|
to spell this
|
2002-05-24 12:22:16 -04:00
|
|
|
|
|
2005-12-14 17:10:16 -05:00
|
|
|
|
from myclass import MyClass
|
|
|
|
|
from foo.bar.yourclass import YourClass
|
2002-05-24 12:22:16 -04:00
|
|
|
|
|
|
|
|
|
If this spelling causes local name clashes, then spell them
|
|
|
|
|
|
2005-12-14 17:10:16 -05:00
|
|
|
|
import myclass
|
|
|
|
|
import foo.bar.yourclass
|
2002-05-24 12:22:16 -04:00
|
|
|
|
|
2005-12-14 17:10:16 -05:00
|
|
|
|
and use "myclass.MyClass" and "foo.bar.yourclass.YourClass"
|
2002-05-24 12:22:16 -04:00
|
|
|
|
|
|
|
|
|
|
2001-07-05 14:56:12 -04:00
|
|
|
|
Whitespace in Expressions and Statements
|
|
|
|
|
|
|
|
|
|
Pet Peeves
|
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
Avoid extraneous whitespace in the following situations:
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
- Immediately inside parentheses, brackets or braces.
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
Yes: spam(ham[1], {eggs: 2})
|
|
|
|
|
No: spam( ham[ 1 ], { eggs: 2 } )
|
|
|
|
|
|
|
|
|
|
- Immediately before a comma, semicolon, or colon:
|
|
|
|
|
|
|
|
|
|
Yes: if x == 4: print x, y; x, y = y, x
|
|
|
|
|
No: if x == 4 : print x , y ; x , y = y , x
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
|
|
|
|
- Immediately before the open parenthesis that starts the argument
|
2005-12-14 16:12:58 -05:00
|
|
|
|
list of a function call:
|
|
|
|
|
|
|
|
|
|
Yes: spam(1)
|
|
|
|
|
No: spam (1)
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
|
|
|
|
- Immediately before the open parenthesis that starts an indexing or
|
2005-12-14 16:12:58 -05:00
|
|
|
|
slicing:
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
Yes: dict['key'] = list[index]
|
|
|
|
|
No: dict ['key'] = list [index]
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
- More than one space around an assignment (or other) operator to
|
|
|
|
|
align it with another.
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
Yes:
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
|
|
|
|
x = 1
|
|
|
|
|
y = 2
|
|
|
|
|
long_variable = 3
|
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
No:
|
|
|
|
|
|
|
|
|
|
x = 1
|
|
|
|
|
y = 2
|
|
|
|
|
long_variable = 3
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Other Recommendations
|
|
|
|
|
|
|
|
|
|
- Always surround these binary operators with a single space on
|
2005-12-14 17:10:16 -05:00
|
|
|
|
either side: assignment (=), augmented assignment (+=, -= etc.),
|
|
|
|
|
comparisons (==, <, >, !=, <>, <=, >=, in, not in, is, is not),
|
|
|
|
|
Booleans (and, or, not).
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
- Use spaces around arithmetic operators:
|
|
|
|
|
|
|
|
|
|
Yes:
|
|
|
|
|
|
|
|
|
|
i = i + 1
|
|
|
|
|
submitted += 1
|
|
|
|
|
x = x * 2 - 1
|
|
|
|
|
hypot2 = x * x + y * y
|
|
|
|
|
c = (a + b) * (a - b)
|
|
|
|
|
|
|
|
|
|
No:
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
i=i+1
|
|
|
|
|
submitted +=1
|
2001-07-05 14:56:12 -04:00
|
|
|
|
x = x*2 - 1
|
|
|
|
|
hypot2 = x*x + y*y
|
|
|
|
|
c = (a+b) * (a-b)
|
|
|
|
|
|
|
|
|
|
- Don't use spaces around the '=' sign when used to indicate a
|
2005-12-14 16:12:58 -05:00
|
|
|
|
keyword argument or a default parameter value.
|
|
|
|
|
|
|
|
|
|
Yes:
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
|
|
|
|
def complex(real, imag=0.0):
|
|
|
|
|
return magic(r=real, i=imag)
|
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
No:
|
|
|
|
|
|
|
|
|
|
def complex(real, imag = 0.0):
|
|
|
|
|
return magic(r = real, i = imag)
|
|
|
|
|
|
2002-10-17 11:32:18 -04:00
|
|
|
|
- Compound statements (multiple statements on the same line) are
|
|
|
|
|
generally discouraged.
|
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
Yes:
|
|
|
|
|
|
|
|
|
|
if foo == 'blah':
|
|
|
|
|
do_blah_thing()
|
|
|
|
|
do_one()
|
|
|
|
|
do_two()
|
|
|
|
|
do_three()
|
|
|
|
|
|
2005-12-14 17:10:16 -05:00
|
|
|
|
Rather not:
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
|
|
|
|
if foo == 'blah': do_blah_thing()
|
|
|
|
|
do_one(); do_two(); do_three()
|
2002-10-17 11:32:18 -04:00
|
|
|
|
|
2005-12-14 17:10:16 -05:00
|
|
|
|
- While sometimes it's okay to put an if/for/while with a small
|
|
|
|
|
body on the same line, never do this for multi-clause
|
|
|
|
|
statements. Also avoid folding such long lines!
|
|
|
|
|
|
|
|
|
|
Rather not:
|
|
|
|
|
|
|
|
|
|
if foo == 'blah': do_blah_thing()
|
|
|
|
|
for x in lst: total += x
|
|
|
|
|
while t < 10: t = delay()
|
|
|
|
|
|
|
|
|
|
Definitely not:
|
|
|
|
|
|
|
|
|
|
if foo == 'blah': do_blah_thing()
|
|
|
|
|
else: do_non_blah_thing()
|
|
|
|
|
|
|
|
|
|
try: something()
|
|
|
|
|
finally: cleanup()
|
|
|
|
|
|
|
|
|
|
do_one(); do_two(); do_three(long, argument,
|
|
|
|
|
list, like, this)
|
|
|
|
|
|
|
|
|
|
if foo == 'blah': one(); two(); three()
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
|
|
|
|
Comments
|
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
Comments that contradict the code are worse than no comments. Always make
|
|
|
|
|
a priority of keeping the comments up-to-date when the code changes!
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
Comments should be complete sentences. If a comment is a phrase or
|
|
|
|
|
sentence, its first word should be capitalized, unless it is an identifier
|
|
|
|
|
that begins with a lower case letter (never alter the case of
|
|
|
|
|
identifiers!).
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
If a comment is short, the period at the end can be omitted. Block
|
|
|
|
|
comments generally consist of one or more paragraphs built out of complete
|
|
|
|
|
sentences, and each sentence should end in a period.
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2005-12-15 10:44:35 -05:00
|
|
|
|
You should use two spaces after a sentence-ending period.
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2001-11-01 08:03:30 -05:00
|
|
|
|
When writing English, Strunk and White apply.
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
|
|
|
|
Python coders from non-English speaking countries: please write
|
|
|
|
|
your comments in English, unless you are 120% sure that the code
|
|
|
|
|
will never be read by people who don't speak your language.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Block Comments
|
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
Block comments generally apply to some (or all) code that follows them,
|
|
|
|
|
and are indented to the same level as that code. Each line of a block
|
|
|
|
|
comment starts with a # and a single space (unless it is indented text
|
|
|
|
|
inside the comment).
|
|
|
|
|
|
|
|
|
|
Paragraphs inside a block comment are separated by a line containing a
|
|
|
|
|
single #.
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
|
|
|
|
Inline Comments
|
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
Use inline comments sparingly.
|
|
|
|
|
|
|
|
|
|
An inline comment is a comment on the same line as a statement. Inline
|
|
|
|
|
comments should be separated by at least two spaces from the statement.
|
|
|
|
|
They should start with a # and a single space.
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
|
|
|
|
Inline comments are unnecessary and in fact distracting if they state
|
|
|
|
|
the obvious. Don't do this:
|
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
x = x + 1 # Increment x
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
|
|
|
|
But sometimes, this is useful:
|
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
x = x + 1 # Compensate for border
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Documentation Strings
|
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
Conventions for writing good documentation strings (a.k.a. "docstrings")
|
|
|
|
|
are immortalized in PEP 257 [3].
|
2002-05-24 12:22:16 -04:00
|
|
|
|
|
|
|
|
|
- Write docstrings for all public modules, functions, classes, and
|
2005-12-14 16:12:58 -05:00
|
|
|
|
methods. Docstrings are not necessary for non-public methods, but you
|
|
|
|
|
should have a comment that describes what the method does. This comment
|
|
|
|
|
should appear after the "def" line.
|
2002-05-24 12:22:16 -04:00
|
|
|
|
|
2002-05-24 15:42:30 -04:00
|
|
|
|
- PEP 257 describes good docstring conventions. Note that most
|
2005-12-14 16:12:58 -05:00
|
|
|
|
importantly, the """ that ends a multiline docstring should be on a line
|
2005-12-14 17:10:16 -05:00
|
|
|
|
by itself, and preferably preceded by a blank line, e.g.:
|
2002-05-24 12:22:16 -04:00
|
|
|
|
|
|
|
|
|
"""Return a foobang
|
|
|
|
|
|
|
|
|
|
Optional plotz says to frobnicate the bizbaz first.
|
2005-12-14 17:10:16 -05:00
|
|
|
|
|
2002-05-24 12:22:16 -04:00
|
|
|
|
"""
|
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
- For one liner docstrings, it's okay to keep the closing """ on the same
|
|
|
|
|
line.
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Version Bookkeeping
|
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
If you have to have Subversion, CVS, or RCS crud in your source file, do
|
|
|
|
|
it as follows.
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
|
|
|
|
__version__ = "$Revision$"
|
|
|
|
|
# $Source$
|
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
These lines should be included after the module's docstring, before any
|
|
|
|
|
other code, separated by a blank line above and below.
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Naming Conventions
|
|
|
|
|
|
2004-03-27 15:14:19 -05:00
|
|
|
|
The naming conventions of Python's library are a bit of a mess, so we'll
|
|
|
|
|
never get this completely consistent -- nevertheless, here are the
|
|
|
|
|
currently recommended naming standards. New modules and packages
|
2005-12-14 16:12:58 -05:00
|
|
|
|
(including third party frameworks) should be written to these standards,
|
|
|
|
|
but where an existing library has a different style, internal consistency
|
|
|
|
|
is preferred.
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
|
|
|
|
Descriptive: Naming Styles
|
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
There are a lot of different naming styles. It helps to be able to
|
|
|
|
|
recognize what naming style is being used, independently from what they
|
|
|
|
|
are used for.
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
|
|
|
|
The following naming styles are commonly distinguished:
|
|
|
|
|
|
2004-03-27 15:14:19 -05:00
|
|
|
|
- b (single lowercase letter)
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2004-03-27 15:14:19 -05:00
|
|
|
|
- B (single uppercase letter)
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
|
|
|
|
- lowercase
|
|
|
|
|
|
|
|
|
|
- lower_case_with_underscores
|
|
|
|
|
|
|
|
|
|
- UPPERCASE
|
|
|
|
|
|
|
|
|
|
- UPPER_CASE_WITH_UNDERSCORES
|
|
|
|
|
|
2001-12-21 00:49:26 -05:00
|
|
|
|
- CapitalizedWords (or CapWords, or CamelCase -- so named because
|
2004-03-27 15:14:19 -05:00
|
|
|
|
of the bumpy look of its letters[4]). This is also sometimes known as
|
|
|
|
|
StudlyCaps.
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
Note: When using abbreviations in CapWords, capitalize all the letters
|
|
|
|
|
of the abbreviation. Thus HTTPServerError is better than
|
|
|
|
|
HttpServerError.
|
|
|
|
|
|
2001-07-05 14:56:12 -04:00
|
|
|
|
- mixedCase (differs from CapitalizedWords by initial lowercase
|
|
|
|
|
character!)
|
|
|
|
|
|
|
|
|
|
- Capitalized_Words_With_Underscores (ugly!)
|
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
There's also the style of using a short unique prefix to group related
|
|
|
|
|
names together. This is not used much in Python, but it is mentioned for
|
|
|
|
|
completeness. For example, the os.stat() function returns a tuple whose
|
|
|
|
|
items traditionally have names like st_mode, st_size, st_mtime and so on.
|
2005-12-14 17:10:16 -05:00
|
|
|
|
(This is done to emphasize the correspondence with the fields of the
|
|
|
|
|
POSIX system call struct, which helps programmers familiar with that.)
|
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
The X11 library uses a leading X for all its public functions. In Python,
|
|
|
|
|
this style is generally deemed unnecessary because attribute and method
|
|
|
|
|
names are prefixed with an object, and function names are prefixed with a
|
|
|
|
|
module name.
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
|
|
|
|
In addition, the following special forms using leading or trailing
|
2005-12-14 16:12:58 -05:00
|
|
|
|
underscores are recognized (these can generally be combined with any case
|
|
|
|
|
convention):
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
- _single_leading_underscore: weak "internal use" indicator. E.g. "from M
|
|
|
|
|
import *" does not import objects whose name starts with an underscore.
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
- single_trailing_underscore_: used by convention to avoid conflicts with
|
|
|
|
|
Python keyword, e.g.
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
Tkinter.Toplevel(master, class_='ClassName')
|
|
|
|
|
|
|
|
|
|
- __double_leading_underscore: when naming a class attribute, invokes name
|
2005-12-14 17:10:16 -05:00
|
|
|
|
mangling (inside class FooBar, __boo becomes _FooBar__boo; see below).
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
|
|
|
|
- __double_leading_and_trailing_underscore__: "magic" objects or
|
2005-12-14 16:12:58 -05:00
|
|
|
|
attributes that live in user-controlled namespaces. E.g. __init__,
|
2005-12-14 17:54:57 -05:00
|
|
|
|
__import__ or __file__. Never invent such names; only use them
|
2005-12-14 17:10:16 -05:00
|
|
|
|
as documented.
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
|
|
|
|
Prescriptive: Naming Conventions
|
|
|
|
|
|
2002-05-24 13:07:17 -04:00
|
|
|
|
Names to Avoid
|
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
Never use the characters `l' (lowercase letter el), `O' (uppercase
|
|
|
|
|
letter oh), or `I' (uppercase letter eye) as single character variable
|
|
|
|
|
names.
|
|
|
|
|
|
|
|
|
|
In some fonts, these characters are indistinguishable from the numerals
|
2005-12-14 17:10:16 -05:00
|
|
|
|
one and zero. When tempted to use `l', use `L' instead.
|
2002-05-24 13:07:17 -04:00
|
|
|
|
|
2007-01-05 09:03:42 -05:00
|
|
|
|
Package and Module Names
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2007-01-05 09:03:42 -05:00
|
|
|
|
Modules should have short, all-lowercase names. Underscores can be used
|
|
|
|
|
in the module name if it improves readability. Python packages should
|
|
|
|
|
also have short, all-lowercase names, although the use of underscores is
|
|
|
|
|
discouraged.
|
2004-03-20 01:42:29 -05:00
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
Since module names are mapped to file names, and some file systems are
|
|
|
|
|
case insensitive and truncate long names, it is important that module
|
|
|
|
|
names be chosen to be fairly short -- this won't be a problem on Unix,
|
2005-12-14 17:10:16 -05:00
|
|
|
|
but it may be a problem when the code is transported to older Mac or
|
|
|
|
|
Windows versions, or DOS.
|
2004-03-20 01:42:29 -05:00
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
When an extension module written in C or C++ has an accompanying Python
|
|
|
|
|
module that provides a higher level (e.g. more object oriented)
|
|
|
|
|
interface, the C/C++ module has a leading underscore (e.g. _socket).
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
|
|
|
|
Class Names
|
|
|
|
|
|
2004-03-20 01:42:29 -05:00
|
|
|
|
Almost without exception, class names use the CapWords convention.
|
|
|
|
|
Classes for internal use have a leading underscore in addition.
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
|
|
|
|
Exception Names
|
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
Because exceptions should be classes, the class naming convention
|
|
|
|
|
applies here. However, you should use the suffix "Error" on your
|
|
|
|
|
exception names (if the exception actually is an error).
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
|
|
|
|
Global Variable Names
|
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
(Let's hope that these variables are meant for use inside one module
|
|
|
|
|
only.) The conventions are about the same as those for functions.
|
|
|
|
|
|
|
|
|
|
Modules that are designed for use via "from M import *" should use the
|
2007-04-27 20:36:48 -04:00
|
|
|
|
__all__ mechanism to prevent exporting globals, or use the older
|
2005-12-14 16:12:58 -05:00
|
|
|
|
convention of prefixing such globals with an underscore (which you might
|
|
|
|
|
want to do to indicate these globals are "module non-public").
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2004-03-27 15:14:19 -05:00
|
|
|
|
Function Names
|
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
Function names should be lowercase, with words separated by underscores
|
|
|
|
|
as necessary to improve readability.
|
|
|
|
|
|
|
|
|
|
mixedCase is allowed only in contexts where that's already the
|
|
|
|
|
prevailing style (e.g. threading.py), to retain backwards compatibility.
|
|
|
|
|
|
|
|
|
|
Function and method arguments
|
|
|
|
|
|
|
|
|
|
Always use 'self' for the first argument to instance methods.
|
|
|
|
|
|
|
|
|
|
Always use 'cls' for the first argument to class methods.
|
|
|
|
|
|
|
|
|
|
If a function argument's name clashes with a reserved keyword, it is
|
|
|
|
|
generally better to append a single trailing underscore rather than use
|
|
|
|
|
an abbreviation or spelling corruption. Thus "print_" is better than
|
2005-12-14 17:10:16 -05:00
|
|
|
|
"prnt". (Perhaps better is to avoid such clashes by using a synonym.)
|
2004-03-27 15:14:19 -05:00
|
|
|
|
|
2004-03-20 01:42:29 -05:00
|
|
|
|
Method Names and Instance Variables
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
Use the function naming rules: lowercase with words separated by
|
|
|
|
|
underscores as necessary to improve readability.
|
|
|
|
|
|
|
|
|
|
Use one leading underscore only for non-public methods and instance
|
|
|
|
|
variables.
|
2004-03-29 20:12:22 -05:00
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
To avoid name clashes with subclasses, use two leading underscores to
|
|
|
|
|
invoke Python's name mangling rules.
|
2004-03-29 20:12:22 -05:00
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
Python mangles these names with the class name: if class Foo has an
|
2004-03-29 20:12:22 -05:00
|
|
|
|
attribute named __a, it cannot be accessed by Foo.__a. (An insistent
|
2005-12-14 16:12:58 -05:00
|
|
|
|
user could still gain access by calling Foo._Foo__a.) Generally, double
|
|
|
|
|
leading underscores should be used only to avoid name conflicts with
|
|
|
|
|
attributes in classes designed to be subclassed.
|
|
|
|
|
|
|
|
|
|
Note: there is some controversy about the use of __names (see below).
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2009-01-21 22:33:57 -05:00
|
|
|
|
Constants
|
|
|
|
|
|
2010-11-17 13:26:43 -05:00
|
|
|
|
Constants are usually defined on a module level and written in all
|
2009-01-22 03:36:39 -05:00
|
|
|
|
capital letters with underscores separating words. Examples include
|
2009-01-21 22:33:57 -05:00
|
|
|
|
MAX_OVERFLOW and TOTAL.
|
|
|
|
|
|
2002-05-24 12:22:16 -04:00
|
|
|
|
Designing for inheritance
|
|
|
|
|
|
|
|
|
|
Always decide whether a class's methods and instance variables
|
2005-12-14 16:12:58 -05:00
|
|
|
|
(collectively: "attributes") should be public or non-public. If in
|
|
|
|
|
doubt, choose non-public; it's easier to make it public later than to
|
|
|
|
|
make a public attribute non-public.
|
|
|
|
|
|
|
|
|
|
Public attributes are those that you expect unrelated clients of your
|
|
|
|
|
class to use, with your commitment to avoid backward incompatible
|
|
|
|
|
changes. Non-public attributes are those that are not intended to be
|
2006-03-01 22:46:55 -05:00
|
|
|
|
used by third parties; you make no guarantees that non-public attributes
|
2005-12-14 16:12:58 -05:00
|
|
|
|
won't change or even be removed.
|
|
|
|
|
|
|
|
|
|
We don't use the term "private" here, since no attribute is really
|
|
|
|
|
private in Python (without a generally unnecessary amount of work).
|
2002-05-24 12:22:16 -04:00
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
Another category of attributes are those that are part of the "subclass
|
|
|
|
|
API" (often called "protected" in other languages). Some classes are
|
|
|
|
|
designed to be inherited from, either to extend or modify aspects of the
|
|
|
|
|
class's behavior. When designing such a class, take care to make
|
|
|
|
|
explicit decisions about which attributes are public, which are part of
|
|
|
|
|
the subclass API, and which are truly only to be used by your base
|
|
|
|
|
class.
|
2002-05-24 12:22:16 -04:00
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
With this in mind, here are the Pythonic guidelines:
|
2002-05-24 12:22:16 -04:00
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
- Public attributes should have no leading underscores.
|
2002-05-24 12:22:16 -04:00
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
- If your public attribute name collides with a reserved keyword, append
|
|
|
|
|
a single trailing underscore to your attribute name. This is
|
2006-03-23 13:56:43 -05:00
|
|
|
|
preferable to an abbreviation or corrupted spelling. (However,
|
|
|
|
|
notwithstanding this rule, 'cls' is the preferred spelling for any
|
|
|
|
|
variable or argument which is known to be a class, especially the
|
|
|
|
|
first argument to a class method.)
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
|
|
|
|
Note 1: See the argument name recommendation above for class methods.
|
|
|
|
|
|
|
|
|
|
- For simple public data attributes, it is best to expose just the
|
|
|
|
|
attribute name, without complicated accessor/mutator methods. Keep in
|
|
|
|
|
mind that Python provides an easy path to future enhancement, should
|
|
|
|
|
you find that a simple data attribute needs to grow functional
|
|
|
|
|
behavior. In that case, use properties to hide functional
|
|
|
|
|
implementation behind simple data attribute access syntax.
|
|
|
|
|
|
|
|
|
|
Note 1: Properties only work on new-style classes.
|
|
|
|
|
|
|
|
|
|
Note 2: Try to keep the functional behavior side-effect free, although
|
|
|
|
|
side-effects such as caching are generally fine.
|
|
|
|
|
|
2005-12-14 17:10:16 -05:00
|
|
|
|
Note 3: Avoid using properties for computationally expensive
|
|
|
|
|
operations; the attribute notation makes the caller believe
|
|
|
|
|
that access is (relatively) cheap.
|
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
- If your class is intended to be subclassed, and you have attributes
|
|
|
|
|
that you do not want subclasses to use, consider naming them with
|
|
|
|
|
double leading underscores and no trailing underscores. This invokes
|
|
|
|
|
Python's name mangling algorithm, where the name of the class is
|
|
|
|
|
mangled into the attribute name. This helps avoid attribute name
|
|
|
|
|
collisions should subclasses inadvertently contain attributes with the
|
|
|
|
|
same name.
|
|
|
|
|
|
|
|
|
|
Note 1: Note that only the simple class name is used in the mangled
|
|
|
|
|
name, so if a subclass chooses both the same class name and attribute
|
|
|
|
|
name, you can still get name collisions.
|
|
|
|
|
|
|
|
|
|
Note 2: Name mangling can make certain uses, such as debugging and
|
|
|
|
|
__getattr__(), less convenient. However the name mangling algorithm
|
|
|
|
|
is well documented and easy to perform manually.
|
2002-05-24 12:22:16 -04:00
|
|
|
|
|
2005-12-14 17:10:16 -05:00
|
|
|
|
Note 3: Not everyone likes name mangling. Try to balance the
|
|
|
|
|
need to avoid accidental name clashes with potential use by
|
|
|
|
|
advanced callers.
|
|
|
|
|
|
2002-05-24 12:22:16 -04:00
|
|
|
|
|
2002-05-24 15:39:47 -04:00
|
|
|
|
Programming Recommendations
|
2002-05-24 12:22:16 -04:00
|
|
|
|
|
2004-08-06 14:47:26 -04:00
|
|
|
|
- Code should be written in a way that does not disadvantage other
|
|
|
|
|
implementations of Python (PyPy, Jython, IronPython, Pyrex, Psyco,
|
2005-12-14 16:12:58 -05:00
|
|
|
|
and such).
|
|
|
|
|
|
|
|
|
|
For example, do not rely on CPython's efficient implementation of
|
|
|
|
|
in-place string concatenation for statements in the form a+=b or a=a+b.
|
|
|
|
|
Those statements run more slowly in Jython. In performance sensitive
|
|
|
|
|
parts of the library, the ''.join() form should be used instead. This
|
2007-02-01 16:04:19 -05:00
|
|
|
|
will ensure that concatenation occurs in linear time across various
|
2005-12-14 16:12:58 -05:00
|
|
|
|
implementations.
|
2004-08-06 14:47:26 -04:00
|
|
|
|
|
2002-05-24 15:39:47 -04:00
|
|
|
|
- Comparisons to singletons like None should always be done with
|
2005-12-14 16:12:58 -05:00
|
|
|
|
'is' or 'is not', never the equality operators.
|
|
|
|
|
|
|
|
|
|
Also, beware of writing "if x" when you really mean "if x is not None"
|
|
|
|
|
-- e.g. when testing whether a variable or argument that defaults to
|
2005-12-14 17:10:16 -05:00
|
|
|
|
None was set to some other value. The other value might have a type
|
|
|
|
|
(such as a container) that could be false in a boolean context!
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
2011-04-06 16:53:31 -04:00
|
|
|
|
- When implementing ordering operations with rich comparisons, it is best to
|
|
|
|
|
implement all six operations (__eq__, __ne__, __lt__, __le__, __gt__,
|
|
|
|
|
__ge__) rather than relying on other code to only exercise a particular
|
|
|
|
|
comparison.
|
|
|
|
|
|
|
|
|
|
To minimize the effort involved, the functools.total_ordering() decorator
|
|
|
|
|
provides a tool to generate missing comparison methods.
|
|
|
|
|
|
|
|
|
|
PEP 207 indicates that reflexivity rules *are* assumed by Python. Thus,
|
|
|
|
|
the interpreter may swap y>x with x<y, y>=x with x<=y, and may swap the
|
|
|
|
|
arguments of x==y and x!=y. The sort() and min() operations are
|
|
|
|
|
guaranteed to use the < operator and the max() function uses the >
|
|
|
|
|
operator. However, it is best to implement all six operations so that
|
|
|
|
|
confusion doesn't arise in other contexts.
|
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
- Use class-based exceptions.
|
|
|
|
|
|
2007-02-01 16:03:07 -05:00
|
|
|
|
String exceptions in new code are forbidden, because this language
|
|
|
|
|
feature is being removed in Python 2.6.
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
|
|
|
|
Modules or packages should define their own domain-specific base
|
|
|
|
|
exception class, which should be subclassed from the built-in Exception
|
|
|
|
|
class. Always include a class docstring. E.g.:
|
2002-05-24 12:22:16 -04:00
|
|
|
|
|
|
|
|
|
class MessageError(Exception):
|
|
|
|
|
"""Base class for errors in the email package."""
|
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
Class naming conventions apply here, although you should add the suffix
|
|
|
|
|
"Error" to your exception classes, if the exception is an error.
|
|
|
|
|
Non-error exceptions need no special suffix.
|
2005-08-07 09:27:54 -04:00
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
- When raising an exception, use "raise ValueError('message')" instead of
|
|
|
|
|
the older form "raise ValueError, 'message'".
|
2002-05-24 12:22:16 -04:00
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
The paren-using form is preferred because when the exception arguments
|
|
|
|
|
are long or include string formatting, you don't need to use line
|
|
|
|
|
continuation characters thanks to the containing parentheses. The older
|
|
|
|
|
form will be removed in Python 3000.
|
|
|
|
|
|
2007-02-01 16:09:28 -05:00
|
|
|
|
- When catching exceptions, mention specific exceptions
|
|
|
|
|
whenever possible instead of using a bare 'except:' clause.
|
|
|
|
|
|
|
|
|
|
For example, use:
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
import platform_specific_module
|
|
|
|
|
except ImportError:
|
2011-02-09 01:50:14 -05:00
|
|
|
|
platform_specific_module = None
|
2007-02-01 16:09:28 -05:00
|
|
|
|
|
|
|
|
|
A bare 'except:' clause will catch SystemExit and KeyboardInterrupt
|
|
|
|
|
exceptions, making it harder to interrupt a program with Control-C,
|
|
|
|
|
and can disguise other problems. If you want to catch all
|
2007-06-12 17:19:21 -04:00
|
|
|
|
exceptions that signal program errors, use 'except Exception:'.
|
2007-02-01 16:09:28 -05:00
|
|
|
|
|
2011-02-09 01:50:14 -05:00
|
|
|
|
A good rule of thumb is to limit use of bare 'except' clauses to two
|
2007-02-01 16:09:28 -05:00
|
|
|
|
cases:
|
|
|
|
|
|
|
|
|
|
1) If the exception handler will be printing out or logging
|
|
|
|
|
the traceback; at least the user will be aware that an
|
|
|
|
|
error has occurred.
|
|
|
|
|
|
|
|
|
|
2) If the code needs to do some cleanup work, but then lets
|
|
|
|
|
the exception propagate upwards with 'raise'.
|
|
|
|
|
'try...finally' is a better way to handle this case.
|
|
|
|
|
|
2007-04-06 11:09:21 -04:00
|
|
|
|
- Additionally, for all try/except clauses, limit the 'try' clause
|
|
|
|
|
to the absolute minimum amount of code necessary. Again, this
|
|
|
|
|
avoids masking bugs.
|
|
|
|
|
|
|
|
|
|
Yes:
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
value = collection[key]
|
|
|
|
|
except KeyError:
|
|
|
|
|
return key_not_found(key)
|
|
|
|
|
else:
|
|
|
|
|
return handle_value(value)
|
|
|
|
|
|
|
|
|
|
No:
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
# Too broad!
|
|
|
|
|
return handle_value(collection[key])
|
|
|
|
|
except KeyError:
|
|
|
|
|
# Will also catch KeyError raised by handle_value()
|
|
|
|
|
return key_not_found(key)
|
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
- Use string methods instead of the string module.
|
|
|
|
|
|
|
|
|
|
String methods are always much faster and share the same API with
|
|
|
|
|
unicode strings. Override this rule if backward compatibility with
|
|
|
|
|
Pythons older than 2.0 is required.
|
|
|
|
|
|
|
|
|
|
- Use ''.startswith() and ''.endswith() instead of string slicing to check
|
|
|
|
|
for prefixes or suffixes.
|
|
|
|
|
|
|
|
|
|
startswith() and endswith() are cleaner and less error prone. For
|
|
|
|
|
example:
|
2002-05-24 12:22:16 -04:00
|
|
|
|
|
|
|
|
|
Yes: if foo.startswith('bar'):
|
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
No: if foo[:3] == 'bar':
|
|
|
|
|
|
|
|
|
|
The exception is if your code must work with Python 1.5.2 (but let's
|
|
|
|
|
hope not!).
|
2002-05-24 12:22:16 -04:00
|
|
|
|
|
|
|
|
|
- Object type comparisons should always use isinstance() instead
|
2005-12-14 16:12:58 -05:00
|
|
|
|
of comparing types directly.
|
2002-05-24 12:22:16 -04:00
|
|
|
|
|
|
|
|
|
Yes: if isinstance(obj, int):
|
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
No: if type(obj) is type(1):
|
|
|
|
|
|
|
|
|
|
When checking if an object is a string, keep in mind that it might be a
|
|
|
|
|
unicode string too! In Python 2.3, str and unicode have a common base
|
|
|
|
|
class, basestring, so you can do:
|
2002-05-24 12:22:16 -04:00
|
|
|
|
|
2002-06-04 13:02:07 -04:00
|
|
|
|
if isinstance(obj, basestring):
|
2002-06-04 12:57:44 -04:00
|
|
|
|
|
2002-05-24 12:22:16 -04:00
|
|
|
|
- For sequences, (strings, lists, tuples), use the fact that empty
|
2005-12-14 16:12:58 -05:00
|
|
|
|
sequences are false.
|
|
|
|
|
|
|
|
|
|
Yes: if not seq:
|
|
|
|
|
if seq:
|
|
|
|
|
|
|
|
|
|
No: if len(seq)
|
|
|
|
|
if not len(seq)
|
2002-05-24 12:22:16 -04:00
|
|
|
|
|
2002-05-24 15:39:47 -04:00
|
|
|
|
- Don't write string literals that rely on significant trailing
|
2005-12-14 16:12:58 -05:00
|
|
|
|
whitespace. Such trailing whitespace is visually indistinguishable and
|
|
|
|
|
some editors (or more recently, reindent.py) will trim them.
|
2002-05-24 15:39:47 -04:00
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
- Don't compare boolean values to True or False using ==
|
2002-05-24 15:46:20 -04:00
|
|
|
|
|
2005-12-14 17:10:16 -05:00
|
|
|
|
Yes: if greeting:
|
2005-12-14 17:54:57 -05:00
|
|
|
|
|
2005-12-14 17:10:16 -05:00
|
|
|
|
No: if greeting == True:
|
2005-12-14 17:54:57 -05:00
|
|
|
|
|
2005-12-14 17:10:16 -05:00
|
|
|
|
Worse: if greeting is True:
|
2002-05-24 15:39:47 -04:00
|
|
|
|
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
|
|
|
|
References
|
|
|
|
|
|
|
|
|
|
[1] PEP 7, Style Guide for C Code, van Rossum
|
|
|
|
|
|
|
|
|
|
[2] http://www.python.org/doc/essays/styleguide.html
|
|
|
|
|
|
|
|
|
|
[3] PEP 257, Docstring Conventions, Goodger, van Rossum
|
|
|
|
|
|
2001-12-21 00:49:26 -05:00
|
|
|
|
[4] http://www.wikipedia.com/wiki/CamelCase
|
|
|
|
|
|
2004-03-27 15:37:02 -05:00
|
|
|
|
[5] Barry's GNU Mailman style guide
|
|
|
|
|
http://barry.warsaw.us/software/STYLEGUIDE.txt
|
2002-05-24 12:22:16 -04:00
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
[6] PEP 20, The Zen of Python
|
|
|
|
|
|
2005-12-14 17:54:57 -05:00
|
|
|
|
[7] PEP 328, Imports: Multi-Line and Absolute/Relative
|
2005-12-14 17:10:16 -05:00
|
|
|
|
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
|
|
|
|
Copyright
|
|
|
|
|
|
|
|
|
|
This document has been placed in the public domain.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Local Variables:
|
|
|
|
|
mode: indented-text
|
|
|
|
|
indent-tabs-mode: nil
|
|
|
|
|
End:
|