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$
|
2012-03-15 03:18:38 -04:00
|
|
|
|
Author: Guido van Rossum <guido@python.org>,
|
2013-08-01 08:25:37 -04:00
|
|
|
|
Barry Warsaw <barry@python.org>,
|
|
|
|
|
Nick Coghlan <ncoghlan@gmail.com>
|
2001-07-05 14:56:12 -04:00
|
|
|
|
Status: Active
|
2007-06-19 00:52:34 -04:00
|
|
|
|
Type: Process
|
2012-03-15 03:18:38 -04:00
|
|
|
|
Content-Type: text/x-rst
|
2001-07-05 14:56:12 -04:00
|
|
|
|
Created: 05-Jul-2001
|
2013-08-01 08:25:37 -04:00
|
|
|
|
Post-History: 05-Jul-2001, 01-Aug-2013
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Introduction
|
2012-03-15 03:18:38 -04:00
|
|
|
|
============
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
This document gives coding conventions for the Python code comprising
|
|
|
|
|
the standard library in the main Python distribution. Please see the
|
2022-01-21 06:03:51 -05:00
|
|
|
|
companion informational PEP describing :pep:`style guidelines for the C code
|
|
|
|
|
in the C implementation of Python <7>`.
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2022-01-21 06:03:51 -05:00
|
|
|
|
This document and :pep:`257` (Docstring Conventions) were adapted from
|
2012-10-27 17:33:29 -04:00
|
|
|
|
Guido's original Python Style Guide essay, with some additions from
|
|
|
|
|
Barry's style guide [2]_.
|
2001-07-05 16:38:11 -04:00
|
|
|
|
|
2013-08-01 08:25:37 -04:00
|
|
|
|
This style guide evolves over time as additional conventions are
|
|
|
|
|
identified and past conventions are rendered obsolete by changes in
|
|
|
|
|
the language itself.
|
|
|
|
|
|
2013-08-01 22:30:37 -04:00
|
|
|
|
Many projects have their own coding style guidelines. In the event of any
|
|
|
|
|
conflicts, such project-specific guides take precedence for that project.
|
2013-08-01 22:26:24 -04:00
|
|
|
|
|
2001-07-05 16:38:11 -04:00
|
|
|
|
|
|
|
|
|
A Foolish Consistency is the Hobgoblin of Little Minds
|
2012-03-15 03:18:38 -04:00
|
|
|
|
======================================================
|
2001-07-05 16:38:11 -04:00
|
|
|
|
|
2012-03-15 03:18:38 -04: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
|
2022-01-21 06:03:51 -05:00
|
|
|
|
spectrum of Python code. As :pep:`20` says, "Readability counts".
|
2001-07-05 16:38:11 -04:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
A style guide is about consistency. Consistency with this style guide
|
|
|
|
|
is important. Consistency within a project is more important.
|
2016-02-22 09:05:45 -05:00
|
|
|
|
Consistency within one module or function is the most important.
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
2016-02-22 09:05:45 -05:00
|
|
|
|
However, know when to be inconsistent -- sometimes style guide
|
|
|
|
|
recommendations just aren't applicable. When in doubt, use your best
|
2012-03-15 03:18:38 -04:00
|
|
|
|
judgment. Look at other examples and decide what looks best. And
|
|
|
|
|
don't hesitate to ask!
|
2001-07-05 16:38:11 -04:00
|
|
|
|
|
2013-08-01 08:25:37 -04:00
|
|
|
|
In particular: do not break backwards compatibility just to comply with
|
|
|
|
|
this PEP!
|
|
|
|
|
|
|
|
|
|
Some other good reasons to ignore a particular guideline:
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2013-08-01 08:25:37 -04:00
|
|
|
|
1. When applying the guideline would make the code less readable, even
|
|
|
|
|
for someone who is used to reading code that follows this PEP.
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2012-03-15 03:18:38 -04: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
|
|
|
|
|
2013-08-01 08:25:37 -04:00
|
|
|
|
3. Because the code in question predates the introduction of the
|
|
|
|
|
guideline and there is no other reason to be modifying that code.
|
|
|
|
|
|
|
|
|
|
4. When the code needs to remain compatible with older versions of
|
|
|
|
|
Python that don't support the feature recommended by the style guide.
|
|
|
|
|
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2018-07-07 19:20:37 -04:00
|
|
|
|
Code Lay-out
|
2012-03-15 03:18:38 -04:00
|
|
|
|
============
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
Indentation
|
|
|
|
|
-----------
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
Use 4 spaces per indentation level.
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
Continuation lines should align wrapped elements either vertically
|
|
|
|
|
using Python's implicit line joining inside parentheses, brackets and
|
2014-04-27 13:34:33 -04:00
|
|
|
|
braces, or using a *hanging indent* [#fn-hi]_. When using a hanging
|
2016-02-22 09:05:45 -05:00
|
|
|
|
indent the following should be considered; there should be no
|
|
|
|
|
arguments on the first line and further indentation should be used to
|
2020-04-01 12:34:28 -04:00
|
|
|
|
clearly distinguish itself as a continuation line::
|
2011-06-02 14:09:20 -04:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
# Correct:
|
2011-06-02 14:09:20 -04:00
|
|
|
|
|
2014-04-27 13:34:33 -04:00
|
|
|
|
# Aligned with opening delimiter.
|
2012-03-15 03:18:38 -04:00
|
|
|
|
foo = long_function_name(var_one, var_two,
|
|
|
|
|
var_three, var_four)
|
2011-06-02 14:09:20 -04:00
|
|
|
|
|
2019-01-09 14:02:41 -05:00
|
|
|
|
# Add 4 spaces (an extra level of indentation) to distinguish arguments from the rest.
|
2012-03-15 03:18:38 -04:00
|
|
|
|
def long_function_name(
|
|
|
|
|
var_one, var_two, var_three,
|
|
|
|
|
var_four):
|
|
|
|
|
print(var_one)
|
2011-06-02 14:09:20 -04:00
|
|
|
|
|
2014-04-27 13:34:33 -04:00
|
|
|
|
# Hanging indents should add a level.
|
|
|
|
|
foo = long_function_name(
|
|
|
|
|
var_one, var_two,
|
|
|
|
|
var_three, var_four)
|
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
::
|
|
|
|
|
|
|
|
|
|
# Wrong:
|
2011-06-13 12:48:33 -04:00
|
|
|
|
|
2014-04-27 13:34:33 -04:00
|
|
|
|
# Arguments on first line forbidden when not using vertical alignment.
|
2012-03-15 03:18:38 -04:00
|
|
|
|
foo = long_function_name(var_one, var_two,
|
|
|
|
|
var_three, var_four)
|
2011-06-02 14:09:20 -04:00
|
|
|
|
|
2014-04-27 13:34:33 -04:00
|
|
|
|
# Further indentation required as indentation is not distinguishable.
|
2012-03-15 03:18:38 -04:00
|
|
|
|
def long_function_name(
|
|
|
|
|
var_one, var_two, var_three,
|
|
|
|
|
var_four):
|
|
|
|
|
print(var_one)
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2014-04-27 16:26:18 -04:00
|
|
|
|
The 4-space rule is optional for continuation lines.
|
2014-04-27 13:34:33 -04:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
Optional::
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
2014-04-27 13:34:33 -04:00
|
|
|
|
# Hanging indents *may* be indented to other than 4 spaces.
|
2012-03-15 03:18:38 -04:00
|
|
|
|
foo = long_function_name(
|
|
|
|
|
var_one, var_two,
|
|
|
|
|
var_three, var_four)
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2014-08-17 12:24:10 -04:00
|
|
|
|
.. _`multiline if-statements`:
|
|
|
|
|
|
|
|
|
|
When the conditional part of an ``if``-statement is long enough to require
|
|
|
|
|
that it be written across multiple lines, it's worth noting that the
|
|
|
|
|
combination of a two character keyword (i.e. ``if``), plus a single space,
|
|
|
|
|
plus an opening parenthesis creates a natural 4-space indent for the
|
|
|
|
|
subsequent lines of the multiline conditional. This can produce a visual
|
|
|
|
|
conflict with the indented suite of code nested inside the ``if``-statement,
|
|
|
|
|
which would also naturally be indented to 4 spaces. This PEP takes no
|
|
|
|
|
explicit position on how (or whether) to further visually distinguish such
|
|
|
|
|
conditional lines from the nested suite inside the ``if``-statement.
|
|
|
|
|
Acceptable options in this situation include, but are not limited to::
|
2014-04-27 13:34:33 -04:00
|
|
|
|
|
|
|
|
|
# No extra indentation.
|
2014-08-17 12:24:10 -04:00
|
|
|
|
if (this_is_one_thing and
|
|
|
|
|
that_is_another_thing):
|
2014-04-27 13:34:33 -04:00
|
|
|
|
do_something()
|
|
|
|
|
|
|
|
|
|
# Add a comment, which will provide some distinction in editors
|
|
|
|
|
# supporting syntax highlighting.
|
2014-08-17 12:24:10 -04:00
|
|
|
|
if (this_is_one_thing and
|
|
|
|
|
that_is_another_thing):
|
2014-04-27 13:34:33 -04:00
|
|
|
|
# Since both conditions are true, we can frobnicate.
|
|
|
|
|
do_something()
|
|
|
|
|
|
|
|
|
|
# Add some extra indentation on the conditional continuation line.
|
2016-04-15 12:54:42 -04:00
|
|
|
|
if (this_is_one_thing
|
|
|
|
|
and that_is_another_thing):
|
2014-04-27 13:34:33 -04:00
|
|
|
|
do_something()
|
|
|
|
|
|
2016-04-15 12:43:52 -04:00
|
|
|
|
(Also see the discussion of whether to break before or after binary
|
|
|
|
|
operators below.)
|
|
|
|
|
|
2017-11-05 19:52:16 -05:00
|
|
|
|
The closing brace/bracket/parenthesis on multiline constructs may
|
2013-07-09 09:27:16 -04:00
|
|
|
|
either line up under the first non-whitespace character of the last
|
|
|
|
|
line of list, as in::
|
2013-04-18 20:31:05 -04:00
|
|
|
|
|
|
|
|
|
my_list = [
|
|
|
|
|
1, 2, 3,
|
|
|
|
|
4, 5, 6,
|
|
|
|
|
]
|
|
|
|
|
result = some_function_that_takes_arguments(
|
|
|
|
|
'a', 'b', 'c',
|
|
|
|
|
'd', 'e', 'f',
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
or it may be lined up under the first character of the line that
|
2017-11-05 19:52:16 -05:00
|
|
|
|
starts the multiline construct, as in::
|
2013-04-18 20:31:05 -04:00
|
|
|
|
|
|
|
|
|
my_list = [
|
|
|
|
|
1, 2, 3,
|
|
|
|
|
4, 5, 6,
|
|
|
|
|
]
|
|
|
|
|
result = some_function_that_takes_arguments(
|
|
|
|
|
'a', 'b', 'c',
|
|
|
|
|
'd', 'e', 'f',
|
|
|
|
|
)
|
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
Tabs or Spaces?
|
|
|
|
|
---------------
|
2002-05-24 11:01:43 -04:00
|
|
|
|
|
2013-08-01 08:25:37 -04:00
|
|
|
|
Spaces are the preferred indentation method.
|
|
|
|
|
|
|
|
|
|
Tabs should be used solely to remain consistent with code that is
|
|
|
|
|
already indented with tabs.
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2021-09-01 18:44:36 -04:00
|
|
|
|
Python disallows mixing tabs and spaces for indentation.
|
2013-08-01 08:25:37 -04:00
|
|
|
|
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
Maximum Line Length
|
|
|
|
|
-------------------
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2013-08-01 21:12:07 -04:00
|
|
|
|
Limit all lines to a maximum of 79 characters.
|
2013-08-01 08:25:37 -04:00
|
|
|
|
|
|
|
|
|
For flowing long blocks of text with fewer structural restrictions
|
2013-08-01 21:12:07 -04:00
|
|
|
|
(docstrings or comments), the line length should be limited to 72
|
|
|
|
|
characters.
|
2012-03-15 03:18:38 -04:00
|
|
|
|
|
2013-08-01 08:25:37 -04:00
|
|
|
|
Limiting the required editor window width makes it possible to have
|
2021-02-03 09:06:23 -05:00
|
|
|
|
several files open side by side, and works well when using code
|
2013-08-01 08:25:37 -04:00
|
|
|
|
review tools that present the two versions in adjacent columns.
|
|
|
|
|
|
|
|
|
|
The default wrapping in most tools disrupts the visual structure of the
|
|
|
|
|
code, making it more difficult to understand. The limits are chosen to
|
2013-08-01 21:12:07 -04:00
|
|
|
|
avoid wrapping in editors with the window width set to 80, even
|
2013-08-01 08:25:37 -04:00
|
|
|
|
if the tool places a marker glyph in the final column when wrapping
|
|
|
|
|
lines. Some web based tools may not offer dynamic line wrapping at all.
|
2012-03-15 03:18:38 -04:00
|
|
|
|
|
2013-08-01 21:12:07 -04:00
|
|
|
|
Some teams strongly prefer a longer line length. For code maintained
|
|
|
|
|
exclusively or primarily by a team that can reach agreement on this
|
2019-02-23 18:00:16 -05:00
|
|
|
|
issue, it is okay to increase the line length limit up to 99 characters,
|
|
|
|
|
provided that comments and docstrings are still wrapped at 72
|
|
|
|
|
characters.
|
2013-08-01 21:12:07 -04:00
|
|
|
|
|
|
|
|
|
The Python standard library is conservative and requires limiting
|
|
|
|
|
lines to 79 characters (and docstrings/comments to 72).
|
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
The preferred way of wrapping long lines is by using Python's implied
|
|
|
|
|
line continuation inside parentheses, brackets and braces. Long lines
|
|
|
|
|
can be broken over multiple lines by wrapping expressions in
|
|
|
|
|
parentheses. These should be used in preference to using a backslash
|
2013-07-03 13:26:36 -04:00
|
|
|
|
for line continuation.
|
|
|
|
|
|
|
|
|
|
Backslashes may still be appropriate at times. For example, long,
|
2022-01-17 00:44:11 -05:00
|
|
|
|
multiple ``with``-statements could not use implicit continuation
|
|
|
|
|
before Python 3.10, so backslashes were acceptable for that case::
|
2013-07-03 13:26:36 -04:00
|
|
|
|
|
|
|
|
|
with open('/path/to/some/file/you/want/to/read') as file_1, \
|
2014-08-17 12:24:10 -04:00
|
|
|
|
open('/path/to/some/file/being/written', 'w') as file_2:
|
2013-07-03 13:26:36 -04:00
|
|
|
|
file_2.write(file_1.read())
|
|
|
|
|
|
2014-08-17 12:24:10 -04:00
|
|
|
|
(See the previous discussion on `multiline if-statements`_ for further
|
|
|
|
|
thoughts on the indentation of such multiline ``with``-statements.)
|
|
|
|
|
|
2013-07-03 13:26:36 -04:00
|
|
|
|
Another such case is with ``assert`` statements.
|
|
|
|
|
|
2016-04-15 12:43:52 -04:00
|
|
|
|
Make sure to indent the continued line appropriately.
|
|
|
|
|
|
2018-05-24 14:53:55 -04:00
|
|
|
|
Should a Line Break Before or After a Binary Operator?
|
2016-04-15 12:43:52 -04:00
|
|
|
|
------------------------------------------------------
|
|
|
|
|
|
2016-04-20 02:14:50 -04:00
|
|
|
|
For decades the recommended style was to break after binary operators.
|
|
|
|
|
But this can hurt readability in two ways: the operators tend to get
|
|
|
|
|
scattered across different columns on the screen, and each operator is
|
|
|
|
|
moved away from its operand and onto the previous line. Here, the eye
|
|
|
|
|
has to do extra work to tell which items are added and which are
|
|
|
|
|
subtracted::
|
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
# Wrong:
|
|
|
|
|
# operators sit far away from their operands
|
2016-04-20 02:14:50 -04:00
|
|
|
|
income = (gross_wages +
|
|
|
|
|
taxable_interest +
|
|
|
|
|
(dividends - qualified_dividends) -
|
|
|
|
|
ira_deduction -
|
|
|
|
|
student_loan_interest)
|
|
|
|
|
|
|
|
|
|
To solve this readability problem, mathematicians and their publishers
|
|
|
|
|
follow the opposite convention. Donald Knuth explains the traditional
|
|
|
|
|
rule in his *Computers and Typesetting* series: "Although formulas
|
|
|
|
|
within a paragraph always break after binary operations and relations,
|
|
|
|
|
displayed formulas always break before binary operations" [3]_.
|
|
|
|
|
|
|
|
|
|
Following the tradition from mathematics usually results in more
|
|
|
|
|
readable code::
|
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
# Correct:
|
|
|
|
|
# easy to match operators with operands
|
2016-04-20 02:14:50 -04:00
|
|
|
|
income = (gross_wages
|
|
|
|
|
+ taxable_interest
|
|
|
|
|
+ (dividends - qualified_dividends)
|
|
|
|
|
- ira_deduction
|
|
|
|
|
- student_loan_interest)
|
|
|
|
|
|
|
|
|
|
In Python code, it is permissible to break before or after a binary
|
|
|
|
|
operator, as long as the convention is consistent locally. For new
|
|
|
|
|
code Knuth's style is suggested.
|
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
Blank Lines
|
|
|
|
|
-----------
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2015-04-22 17:09:41 -04:00
|
|
|
|
Surround top-level function and class definitions with two blank
|
2012-03-15 03:18:38 -04:00
|
|
|
|
lines.
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2015-04-22 17:09:41 -04:00
|
|
|
|
Method definitions inside a class are surrounded by a single blank
|
2012-03-15 03:18:38 -04:00
|
|
|
|
line.
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2012-03-15 03:18:38 -04: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
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
Use blank lines in functions, sparingly, to indicate logical sections.
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
Python accepts the control-L (i.e. ^L) form feed character as
|
2022-05-11 13:45:05 -04:00
|
|
|
|
whitespace; many tools treat these characters as page separators, so
|
2012-03-15 03:18:38 -04:00
|
|
|
|
you may use them 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
|
|
|
|
|
2013-08-02 06:28:35 -04:00
|
|
|
|
Source File Encoding
|
|
|
|
|
--------------------
|
2002-10-07 09:40:41 -04:00
|
|
|
|
|
2021-09-01 18:44:36 -04:00
|
|
|
|
Code in the core Python distribution should always use UTF-8, and should not
|
|
|
|
|
have an encoding declaration.
|
|
|
|
|
|
|
|
|
|
In the standard library, non-UTF-8 encodings should be used only for
|
|
|
|
|
test purposes. Use non-ASCII characters sparingly, preferably only to
|
|
|
|
|
denote places and human names. If using non-ASCII characters as data,
|
|
|
|
|
avoid noisy Unicode characters like z̯̯͡a̧͎̺l̡͓̫g̹̲o̡̼̘ and byte order
|
|
|
|
|
marks.
|
|
|
|
|
|
|
|
|
|
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).
|
2007-05-17 12:48:09 -04:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
Open source projects with a global audience are encouraged to adopt a
|
|
|
|
|
similar policy.
|
2002-10-07 09:40:41 -04:00
|
|
|
|
|
2002-05-24 12:22:16 -04:00
|
|
|
|
Imports
|
2012-03-15 03:18:38 -04:00
|
|
|
|
-------
|
2002-05-24 12:22:16 -04:00
|
|
|
|
|
2018-07-07 19:20:37 -04:00
|
|
|
|
- Imports should usually be on separate lines::
|
2002-05-24 12:22:16 -04:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
# Correct:
|
|
|
|
|
import os
|
|
|
|
|
import sys
|
|
|
|
|
|
|
|
|
|
::
|
|
|
|
|
|
|
|
|
|
# Wrong:
|
|
|
|
|
import sys, os
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
2002-05-24 12:22:16 -04:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
It's okay to say this though::
|
2002-05-24 12:22:16 -04:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
# Correct:
|
2012-03-15 03:18:38 -04:00
|
|
|
|
from subprocess import Popen, PIPE
|
2002-05-24 12:22:16 -04:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
- Imports are always put at the top of the file, just after any module
|
|
|
|
|
comments and docstrings, and before module globals and constants.
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
Imports should be grouped in the following order:
|
2002-05-24 12:22:16 -04:00
|
|
|
|
|
2018-05-24 14:53:55 -04:00
|
|
|
|
1. Standard library imports.
|
|
|
|
|
2. Related third party imports.
|
|
|
|
|
3. Local application/library specific imports.
|
2002-05-24 12:22:16 -04:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
You should put a blank line between each group of imports.
|
2002-05-24 12:22:16 -04:00
|
|
|
|
|
2013-08-01 08:25:37 -04:00
|
|
|
|
- Absolute imports are recommended, as they are usually more readable
|
|
|
|
|
and tend to be better behaved (or at least give better error
|
|
|
|
|
messages) if the import system is incorrectly configured (such as
|
|
|
|
|
when a directory inside a package ends up on ``sys.path``)::
|
|
|
|
|
|
2018-07-07 19:20:37 -04:00
|
|
|
|
import mypkg.sibling
|
|
|
|
|
from mypkg import sibling
|
|
|
|
|
from mypkg.sibling import example
|
2013-08-01 08:25:37 -04:00
|
|
|
|
|
|
|
|
|
However, explicit relative imports are an acceptable alternative to
|
|
|
|
|
absolute imports, especially when dealing with complex package layouts
|
2013-08-01 17:32:07 -04:00
|
|
|
|
where using absolute imports would be unnecessarily verbose::
|
2013-08-01 08:25:37 -04:00
|
|
|
|
|
2018-07-07 19:20:37 -04:00
|
|
|
|
from . import sibling
|
|
|
|
|
from .sibling import example
|
2013-08-01 08:25:37 -04:00
|
|
|
|
|
|
|
|
|
Standard library code should avoid complex package layouts and always
|
|
|
|
|
use absolute imports.
|
|
|
|
|
|
2012-03-15 03:18:38 -04: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
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
from myclass import MyClass
|
|
|
|
|
from foo.bar.yourclass import YourClass
|
2002-05-24 12:22:16 -04:00
|
|
|
|
|
2018-07-07 19:20:37 -04:00
|
|
|
|
If this spelling causes local name clashes, then spell them explicitly::
|
2002-05-24 12:22:16 -04:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
import myclass
|
|
|
|
|
import foo.bar.yourclass
|
2002-05-24 12:22:16 -04:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
and use "myclass.MyClass" and "foo.bar.yourclass.YourClass".
|
2002-05-24 12:22:16 -04:00
|
|
|
|
|
2013-08-01 08:25:37 -04:00
|
|
|
|
- Wildcard imports (``from <module> import *``) should be avoided, as
|
|
|
|
|
they make it unclear which names are present in the namespace,
|
|
|
|
|
confusing both readers and many automated tools. There is one
|
|
|
|
|
defensible use case for a wildcard import, which is to republish an
|
|
|
|
|
internal interface as part of a public API (for example, overwriting
|
|
|
|
|
a pure Python implementation of an interface with the definitions
|
|
|
|
|
from an optional accelerator module and exactly which definitions
|
|
|
|
|
will be overwritten isn't known in advance).
|
|
|
|
|
|
|
|
|
|
When republishing names this way, the guidelines below regarding
|
|
|
|
|
public and internal interfaces still apply.
|
|
|
|
|
|
2018-07-07 19:20:37 -04:00
|
|
|
|
Module Level Dunder Names
|
2016-06-08 10:43:53 -04:00
|
|
|
|
-------------------------
|
2016-06-07 16:25:19 -04:00
|
|
|
|
|
2016-06-08 10:43:53 -04:00
|
|
|
|
Module level "dunders" (i.e. names with two leading and two trailing
|
|
|
|
|
underscores) such as ``__all__``, ``__author__``, ``__version__``,
|
|
|
|
|
etc. should be placed after the module docstring but before any import
|
|
|
|
|
statements *except* ``from __future__`` imports. Python mandates that
|
|
|
|
|
future-imports must appear in the module before any other code except
|
2018-07-07 19:20:37 -04:00
|
|
|
|
docstrings::
|
2016-06-08 10:43:53 -04:00
|
|
|
|
|
|
|
|
|
"""This is the example module.
|
|
|
|
|
|
|
|
|
|
This module does stuff.
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
from __future__ import barry_as_FLUFL
|
|
|
|
|
|
|
|
|
|
__all__ = ['a', 'b', 'c']
|
|
|
|
|
__version__ = '0.1'
|
|
|
|
|
__author__ = 'Cardinal Biggles'
|
|
|
|
|
|
|
|
|
|
import os
|
|
|
|
|
import sys
|
2016-06-07 16:25:19 -04:00
|
|
|
|
|
|
|
|
|
|
2014-11-29 22:01:24 -05:00
|
|
|
|
String Quotes
|
|
|
|
|
=============
|
|
|
|
|
|
|
|
|
|
In Python, single-quoted strings and double-quoted strings are the
|
2015-01-02 13:09:41 -05:00
|
|
|
|
same. This PEP does not make a recommendation for this. Pick a rule
|
2014-11-29 22:01:24 -05:00
|
|
|
|
and stick to it. When a string contains single or double quote
|
|
|
|
|
characters, however, use the other one to avoid backslashes in the
|
2014-11-29 22:02:36 -05:00
|
|
|
|
string. It improves readability.
|
2014-11-29 22:01:24 -05:00
|
|
|
|
|
|
|
|
|
For triple-quoted strings, always use double quote characters to be
|
2022-01-21 06:03:51 -05:00
|
|
|
|
consistent with the docstring convention in :pep:`257`.
|
2014-11-29 22:01:24 -05:00
|
|
|
|
|
|
|
|
|
|
2001-07-05 14:56:12 -04:00
|
|
|
|
Whitespace in Expressions and Statements
|
2012-03-15 03:18:38 -04:00
|
|
|
|
========================================
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
Pet Peeves
|
|
|
|
|
----------
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
Avoid extraneous whitespace in the following situations:
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
- Immediately inside parentheses, brackets or braces::
|
|
|
|
|
|
|
|
|
|
# Correct:
|
|
|
|
|
spam(ham[1], {eggs: 2})
|
|
|
|
|
|
|
|
|
|
::
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
# Wrong:
|
|
|
|
|
spam( ham[ 1 ], { eggs: 2 } )
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
- Between a trailing comma and a following close parenthesis::
|
2017-02-14 00:50:40 -05:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
# Correct:
|
|
|
|
|
foo = (0,)
|
|
|
|
|
|
|
|
|
|
::
|
|
|
|
|
|
|
|
|
|
# Wrong:
|
|
|
|
|
bar = (0, )
|
2017-02-14 00:50:40 -05:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
- Immediately before a comma, semicolon, or colon::
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
# Correct:
|
2022-01-25 10:20:55 -05:00
|
|
|
|
if x == 4: print(x, y); x, y = y, x
|
2020-04-01 12:34:28 -04:00
|
|
|
|
|
|
|
|
|
::
|
|
|
|
|
|
|
|
|
|
# Wrong:
|
2022-01-25 10:20:55 -05:00
|
|
|
|
if x == 4 : print(x , y) ; x , y = y , x
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2014-08-31 23:18:33 -04:00
|
|
|
|
- However, in a slice the colon acts like a binary operator, and
|
|
|
|
|
should have equal amounts on either side (treating it as the
|
|
|
|
|
operator with the lowest priority). In an extended slice, both
|
|
|
|
|
colons must have the same amount of spacing applied. Exception:
|
2020-04-01 12:34:28 -04:00
|
|
|
|
when a slice parameter is omitted, the space is omitted::
|
2014-08-31 23:18:33 -04:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
# Correct:
|
2014-08-31 23:18:33 -04:00
|
|
|
|
ham[1:9], ham[1:9:3], ham[:9:3], ham[1::3], ham[1:9:]
|
|
|
|
|
ham[lower:upper], ham[lower:upper:], ham[lower::step]
|
|
|
|
|
ham[lower+offset : upper+offset]
|
|
|
|
|
ham[: upper_fn(x) : step_fn(x)], ham[:: step_fn(x)]
|
|
|
|
|
ham[lower + offset : upper + offset]
|
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
::
|
2014-08-31 23:18:33 -04:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
# Wrong:
|
2014-08-31 23:18:33 -04:00
|
|
|
|
ham[lower + offset:upper + offset]
|
|
|
|
|
ham[1: 9], ham[1 :9], ham[1:9 :3]
|
|
|
|
|
ham[lower : : upper]
|
|
|
|
|
ham[ : upper]
|
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
- Immediately before the open parenthesis that starts the argument
|
|
|
|
|
list of a function call::
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
# Correct:
|
|
|
|
|
spam(1)
|
|
|
|
|
|
|
|
|
|
::
|
|
|
|
|
|
|
|
|
|
# Wrong:
|
|
|
|
|
spam (1)
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
- Immediately before the open parenthesis that starts an indexing or
|
|
|
|
|
slicing::
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
# Correct:
|
|
|
|
|
dct['key'] = lst[index]
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
::
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
# Wrong:
|
|
|
|
|
dct ['key'] = lst [index]
|
|
|
|
|
|
|
|
|
|
- More than one space around an assignment (or other) operator to
|
|
|
|
|
align it with another::
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
# Correct:
|
2012-03-15 03:18:38 -04:00
|
|
|
|
x = 1
|
|
|
|
|
y = 2
|
|
|
|
|
long_variable = 3
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
::
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
# Wrong:
|
2012-03-15 03:18:38 -04:00
|
|
|
|
x = 1
|
|
|
|
|
y = 2
|
|
|
|
|
long_variable = 3
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
Other Recommendations
|
|
|
|
|
---------------------
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2016-01-04 11:59:47 -05:00
|
|
|
|
- Avoid trailing whitespace anywhere. Because it's usually invisible,
|
|
|
|
|
it can be confusing: e.g. a backslash followed by a space and a
|
|
|
|
|
newline does not count as a line continuation marker. Some editors
|
|
|
|
|
don't preserve it and many projects (like CPython itself) have
|
|
|
|
|
pre-commit hooks that reject it.
|
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
- Always surround these binary operators with a single space on 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
|
|
|
|
|
2012-04-19 13:42:24 -04:00
|
|
|
|
- If operators with different priorities are used, consider adding
|
|
|
|
|
whitespace around the operators with the lowest priority(ies). Use
|
2013-08-01 17:32:07 -04:00
|
|
|
|
your own judgment; however, never use more than one space, and
|
2012-04-19 13:42:24 -04:00
|
|
|
|
always have the same amount of whitespace on both sides of a binary
|
2020-04-01 12:34:28 -04:00
|
|
|
|
operator::
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
# Correct:
|
2012-03-15 03:18:38 -04:00
|
|
|
|
i = i + 1
|
|
|
|
|
submitted += 1
|
2012-10-27 22:04:41 -04:00
|
|
|
|
x = x*2 - 1
|
|
|
|
|
hypot2 = x*x + y*y
|
|
|
|
|
c = (a+b) * (a-b)
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
::
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
# Wrong:
|
2012-03-15 03:18:38 -04:00
|
|
|
|
i=i+1
|
|
|
|
|
submitted +=1
|
2012-10-27 22:04:41 -04:00
|
|
|
|
x = x * 2 - 1
|
|
|
|
|
hypot2 = x * x + y * y
|
|
|
|
|
c = (a + b) * (a - b)
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2016-01-05 13:33:30 -05:00
|
|
|
|
- Function annotations should use the normal rules for colons and
|
|
|
|
|
always have spaces around the ``->`` arrow if present. (See
|
2020-04-01 12:34:28 -04:00
|
|
|
|
`Function Annotations`_ below for more about function annotations.)::
|
2015-01-02 21:27:29 -05:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
# Correct:
|
2016-01-05 13:33:30 -05:00
|
|
|
|
def munge(input: AnyStr): ...
|
2019-10-18 03:30:07 -04:00
|
|
|
|
def munge() -> PosInt: ...
|
2015-01-02 21:27:29 -05:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
::
|
2015-01-02 21:27:29 -05:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
# Wrong:
|
2016-01-05 13:33:30 -05:00
|
|
|
|
def munge(input:AnyStr): ...
|
|
|
|
|
def munge()->PosInt: ...
|
|
|
|
|
|
2018-10-29 13:52:27 -04:00
|
|
|
|
- Don't use spaces around the ``=`` sign when used to indicate a
|
|
|
|
|
keyword argument, or when used to indicate a default value for an
|
2020-04-01 12:34:28 -04:00
|
|
|
|
*unannotated* function parameter::
|
2018-10-29 13:52:27 -04:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
# Correct:
|
2018-10-29 13:52:27 -04:00
|
|
|
|
def complex(real, imag=0.0):
|
|
|
|
|
return magic(r=real, i=imag)
|
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
::
|
2018-10-29 13:52:27 -04:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
# Wrong:
|
2018-10-29 13:52:27 -04:00
|
|
|
|
def complex(real, imag = 0.0):
|
|
|
|
|
return magic(r = real, i = imag)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
When combining an argument annotation with a default value, however, do use
|
2020-04-01 12:34:28 -04:00
|
|
|
|
spaces around the ``=`` sign::
|
2016-01-05 13:33:30 -05:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
# Correct:
|
2016-01-05 13:33:30 -05:00
|
|
|
|
def munge(sep: AnyStr = None): ...
|
|
|
|
|
def munge(input: AnyStr, sep: AnyStr = None, limit=1000): ...
|
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
::
|
2016-01-05 13:33:30 -05:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
# Wrong:
|
2016-01-05 13:33:30 -05:00
|
|
|
|
def munge(input: AnyStr=None): ...
|
|
|
|
|
def munge(input: AnyStr, limit = 1000): ...
|
2015-01-02 21:22:31 -05:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
- Compound statements (multiple statements on the same line) are
|
2020-04-01 12:34:28 -04:00
|
|
|
|
generally discouraged::
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
# Correct:
|
2012-03-15 03:18:38 -04:00
|
|
|
|
if foo == 'blah':
|
|
|
|
|
do_blah_thing()
|
|
|
|
|
do_one()
|
|
|
|
|
do_two()
|
|
|
|
|
do_three()
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
Rather not::
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
# Wrong:
|
2012-03-15 03:18:38 -04:00
|
|
|
|
if foo == 'blah': do_blah_thing()
|
|
|
|
|
do_one(); do_two(); do_three()
|
2002-10-17 11:32:18 -04:00
|
|
|
|
|
2012-03-15 03:18:38 -04: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!
|
2005-12-14 17:10:16 -05:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
Rather not::
|
2005-12-14 17:10:16 -05:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
# Wrong:
|
2012-03-15 03:18:38 -04:00
|
|
|
|
if foo == 'blah': do_blah_thing()
|
|
|
|
|
for x in lst: total += x
|
|
|
|
|
while t < 10: t = delay()
|
2005-12-14 17:10:16 -05:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
Definitely not::
|
2005-12-14 17:10:16 -05:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
# Wrong:
|
2012-03-15 03:18:38 -04:00
|
|
|
|
if foo == 'blah': do_blah_thing()
|
|
|
|
|
else: do_non_blah_thing()
|
2005-12-14 17:10:16 -05:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
try: something()
|
|
|
|
|
finally: cleanup()
|
2005-12-14 17:10:16 -05:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
do_one(); do_two(); do_three(long, argument,
|
|
|
|
|
list, like, this)
|
2005-12-14 17:10:16 -05:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
if foo == 'blah': one(); two(); three()
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2018-07-07 19:20:37 -04:00
|
|
|
|
|
2018-05-24 14:53:55 -04:00
|
|
|
|
When to Use Trailing Commas
|
2017-02-14 00:50:40 -05:00
|
|
|
|
===========================
|
|
|
|
|
|
|
|
|
|
Trailing commas are usually optional, except they are mandatory when
|
2021-09-01 18:44:36 -04:00
|
|
|
|
making a tuple of one element. For clarity, it is recommended to
|
|
|
|
|
surround the latter in (technically redundant) parentheses::
|
2017-02-14 00:50:40 -05:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
# Correct:
|
2017-11-10 12:22:07 -05:00
|
|
|
|
FILES = ('setup.cfg',)
|
2017-02-14 00:50:40 -05:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
::
|
2017-02-14 00:50:40 -05:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
# Wrong:
|
2017-11-10 12:22:07 -05:00
|
|
|
|
FILES = 'setup.cfg',
|
2017-02-14 00:50:40 -05:00
|
|
|
|
|
|
|
|
|
When trailing commas are redundant, they are often helpful when a
|
|
|
|
|
version control system is used, when a list of values, arguments or
|
|
|
|
|
imported items is expected to be extended over time. The pattern is
|
|
|
|
|
to put each value (etc.) on a line by itself, always adding a trailing
|
|
|
|
|
comma, and add the close parenthesis/bracket/brace on the next line.
|
|
|
|
|
However it does not make sense to have a trailing comma on the same
|
|
|
|
|
line as the closing delimiter (except in the above case of singleton
|
2020-04-01 12:34:28 -04:00
|
|
|
|
tuples)::
|
2017-02-14 00:50:40 -05:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
# Correct:
|
2017-11-10 12:22:07 -05:00
|
|
|
|
FILES = [
|
|
|
|
|
'setup.cfg',
|
|
|
|
|
'tox.ini',
|
|
|
|
|
]
|
|
|
|
|
initialize(FILES,
|
|
|
|
|
error=True,
|
|
|
|
|
)
|
2017-02-14 00:50:40 -05:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
::
|
2017-02-14 00:50:40 -05:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
# Wrong:
|
2017-11-10 12:22:07 -05:00
|
|
|
|
FILES = ['setup.cfg', 'tox.ini',]
|
|
|
|
|
initialize(FILES, error=True,)
|
2017-02-14 00:50:40 -05:00
|
|
|
|
|
|
|
|
|
|
2001-07-05 14:56:12 -04:00
|
|
|
|
Comments
|
2012-03-15 03:18:38 -04:00
|
|
|
|
========
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2012-03-15 03:18:38 -04: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
|
|
|
|
|
2018-05-24 14:53:55 -04:00
|
|
|
|
Comments should be complete sentences. The first word should be
|
2017-10-25 11:28:55 -04:00
|
|
|
|
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
|
|
|
|
|
2017-10-25 11:28:55 -04:00
|
|
|
|
Block comments generally consist of one or more paragraphs built out of
|
|
|
|
|
complete sentences, with each sentence ending in a period.
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2017-11-05 19:52:16 -05:00
|
|
|
|
You should use two spaces after a sentence-ending period in multi-
|
2017-10-25 11:28:55 -04:00
|
|
|
|
sentence comments, except after the final sentence.
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2020-06-26 18:15:32 -04:00
|
|
|
|
Ensure that your comments are clear and easily understandable to other
|
|
|
|
|
speakers of the language you are writing in.
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2012-03-15 03:18:38 -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.
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
Block Comments
|
|
|
|
|
--------------
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2012-03-15 03:18:38 -04: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).
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
Paragraphs inside a block comment are separated by a line containing a
|
|
|
|
|
single ``#``.
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
Inline Comments
|
|
|
|
|
---------------
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
Use inline comments sparingly.
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
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
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
Inline comments are unnecessary and in fact distracting if they state
|
|
|
|
|
the obvious. Don't do this::
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
x = x + 1 # Increment x
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
But sometimes, this is useful::
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
x = x + 1 # Compensate for border
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
|
|
|
|
Documentation Strings
|
2012-03-15 03:18:38 -04:00
|
|
|
|
---------------------
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
Conventions for writing good documentation strings
|
2022-01-21 06:03:51 -05:00
|
|
|
|
(a.k.a. "docstrings") are immortalized in :pep:`257`.
|
2002-05-24 12:22:16 -04:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
- Write docstrings for all public modules, functions, classes, and
|
|
|
|
|
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
|
|
|
|
|
2022-01-21 06:03:51 -05:00
|
|
|
|
- :pep:`257` describes good docstring conventions. Note that most
|
2012-03-15 03:18:38 -04:00
|
|
|
|
importantly, the ``"""`` that ends a multiline docstring should be
|
2018-07-07 19:20:37 -04:00
|
|
|
|
on a line by itself::
|
2002-05-24 12:22:16 -04:00
|
|
|
|
|
|
|
|
|
"""Return a foobang
|
|
|
|
|
|
|
|
|
|
Optional plotz says to frobnicate the bizbaz first.
|
|
|
|
|
"""
|
|
|
|
|
|
2014-03-02 12:29:33 -05:00
|
|
|
|
- For one liner docstrings, please keep the closing ``"""`` on
|
2020-10-21 22:20:02 -04:00
|
|
|
|
the same line::
|
|
|
|
|
|
|
|
|
|
"""Return an ex-parrot."""
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Naming Conventions
|
2012-03-15 03:18:38 -04: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
|
|
|
|
|
(including third party frameworks) should be written to these
|
|
|
|
|
standards, but where an existing library has a different style,
|
|
|
|
|
internal consistency is preferred.
|
|
|
|
|
|
2013-11-01 12:56:37 -04:00
|
|
|
|
Overriding Principle
|
|
|
|
|
--------------------
|
|
|
|
|
|
|
|
|
|
Names that are visible to the user as public parts of the API should
|
|
|
|
|
follow conventions that reflect usage rather than implementation.
|
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
Descriptive: Naming Styles
|
|
|
|
|
--------------------------
|
|
|
|
|
|
|
|
|
|
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.
|
|
|
|
|
|
|
|
|
|
The following naming styles are commonly distinguished:
|
|
|
|
|
|
|
|
|
|
- ``b`` (single lowercase letter)
|
|
|
|
|
- ``B`` (single uppercase letter)
|
|
|
|
|
- ``lowercase``
|
|
|
|
|
- ``lower_case_with_underscores``
|
|
|
|
|
- ``UPPERCASE``
|
|
|
|
|
- ``UPPER_CASE_WITH_UNDERSCORES``
|
|
|
|
|
- ``CapitalizedWords`` (or CapWords, or CamelCase -- so named because
|
2016-04-15 12:43:52 -04:00
|
|
|
|
of the bumpy look of its letters [4]_). This is also sometimes known
|
2012-03-15 03:18:38 -04:00
|
|
|
|
as StudlyCaps.
|
|
|
|
|
|
2017-12-19 16:05:09 -05:00
|
|
|
|
Note: When using acronyms in CapWords, capitalize all the
|
|
|
|
|
letters of the acronym. Thus HTTPServerError is better than
|
2012-03-15 03:18:38 -04:00
|
|
|
|
HttpServerError.
|
|
|
|
|
- ``mixedCase`` (differs from CapitalizedWords by initial lowercase
|
|
|
|
|
character!)
|
|
|
|
|
- ``Capitalized_Words_With_Underscores`` (ugly!)
|
|
|
|
|
|
|
|
|
|
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``,
|
2012-03-15 03:24:13 -04:00
|
|
|
|
``st_size``, ``st_mtime`` and so on. (This is done to emphasize the
|
2012-03-15 03:18:38 -04:00
|
|
|
|
correspondence with the fields of the POSIX system call struct, which
|
|
|
|
|
helps programmers familiar with that.)
|
|
|
|
|
|
|
|
|
|
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.
|
|
|
|
|
|
|
|
|
|
In addition, the following special forms using leading or trailing
|
|
|
|
|
underscores are recognized (these can generally be combined with any
|
|
|
|
|
case convention):
|
|
|
|
|
|
|
|
|
|
- ``_single_leading_underscore``: weak "internal use" indicator.
|
2019-03-13 13:48:04 -04:00
|
|
|
|
E.g. ``from M import *`` does not import objects whose names start
|
2012-03-15 03:18:38 -04:00
|
|
|
|
with an underscore.
|
|
|
|
|
|
|
|
|
|
- ``single_trailing_underscore_``: used by convention to avoid
|
|
|
|
|
conflicts with Python keyword, e.g. ::
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2020-07-11 10:39:44 -04:00
|
|
|
|
tkinter.Toplevel(master, class_='ClassName')
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
- ``__double_leading_underscore``: when naming a class attribute,
|
|
|
|
|
invokes name mangling (inside class FooBar, ``__boo`` becomes
|
|
|
|
|
``_FooBar__boo``; see below).
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
- ``__double_leading_and_trailing_underscore__``: "magic" objects or
|
|
|
|
|
attributes that live in user-controlled namespaces.
|
|
|
|
|
E.g. ``__init__``, ``__import__`` or ``__file__``. Never invent
|
|
|
|
|
such names; only use them as documented.
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
Prescriptive: Naming Conventions
|
|
|
|
|
--------------------------------
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
Names to Avoid
|
|
|
|
|
~~~~~~~~~~~~~~
|
2002-05-24 13:07:17 -04:00
|
|
|
|
|
2012-03-15 03:23:23 -04:00
|
|
|
|
Never use the characters 'l' (lowercase letter el), 'O' (uppercase
|
|
|
|
|
letter oh), or 'I' (uppercase letter eye) as single character variable
|
2012-03-15 03:18:38 -04:00
|
|
|
|
names.
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
In some fonts, these characters are indistinguishable from the
|
2012-03-15 03:23:23 -04:00
|
|
|
|
numerals one and zero. When tempted to use 'l', use 'L' instead.
|
2002-05-24 13:07:17 -04:00
|
|
|
|
|
2017-06-05 22:57:48 -04:00
|
|
|
|
ASCII Compatibility
|
|
|
|
|
~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
|
|
Identifiers used in the standard library must be ASCII compatible
|
|
|
|
|
as described in the
|
2022-01-21 06:03:51 -05:00
|
|
|
|
:pep:`policy section <3131#policy-specification>`
|
|
|
|
|
of :pep:`3131`.
|
2017-06-05 22:57:48 -04:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
Package and Module Names
|
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2012-03-15 03:18:38 -04: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
|
|
|
|
|
2012-03-15 03:18:38 -04: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
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
Class Names
|
|
|
|
|
~~~~~~~~~~~
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2013-11-01 12:56:37 -04:00
|
|
|
|
Class names should normally use the CapWords convention.
|
|
|
|
|
|
|
|
|
|
The naming convention for functions may be used instead in cases where
|
|
|
|
|
the interface is documented and used primarily as a callable.
|
|
|
|
|
|
|
|
|
|
Note that there is a separate convention for builtin names: most builtin
|
|
|
|
|
names are single words (or two words run together), with the CapWords
|
|
|
|
|
convention used only for exception names and builtin constants.
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2018-05-24 14:53:55 -04:00
|
|
|
|
Type Variable Names
|
2016-08-03 14:33:00 -04:00
|
|
|
|
~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
2022-01-21 06:03:51 -05:00
|
|
|
|
Names of type variables introduced in :pep:`484` should normally use CapWords
|
2016-08-03 14:33:00 -04:00
|
|
|
|
preferring short names: ``T``, ``AnyStr``, ``Num``. It is recommended to add
|
|
|
|
|
suffixes ``_co`` or ``_contra`` to the variables used to declare covariant
|
2018-07-07 19:20:37 -04:00
|
|
|
|
or contravariant behavior correspondingly::
|
2016-08-03 14:33:00 -04:00
|
|
|
|
|
2018-07-07 19:20:37 -04:00
|
|
|
|
from typing import TypeVar
|
2016-08-03 14:33:00 -04:00
|
|
|
|
|
2018-07-07 19:20:37 -04:00
|
|
|
|
VT_co = TypeVar('VT_co', covariant=True)
|
|
|
|
|
KT_contra = TypeVar('KT_contra', contravariant=True)
|
2016-08-03 14:33:00 -04:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
Exception Names
|
|
|
|
|
~~~~~~~~~~~~~~~
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2012-03-15 03:18:38 -04: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
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
Global Variable Names
|
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2012-03-15 03:18:38 -04: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.
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
2012-03-15 03:23:23 -04:00
|
|
|
|
Modules that are designed for use via ``from M import *`` should use
|
|
|
|
|
the ``__all__`` mechanism to prevent exporting globals, or use the
|
|
|
|
|
older 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
|
|
|
|
|
2018-05-24 14:53:55 -04:00
|
|
|
|
Function and Variable Names
|
2018-01-17 18:56:23 -05:00
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
2004-03-27 15:14:19 -05:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
Function names should be lowercase, with words separated by
|
|
|
|
|
underscores as necessary to improve readability.
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
2018-01-17 18:56:23 -05:00
|
|
|
|
Variable names follow the same convention as function names.
|
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
mixedCase is allowed only in contexts where that's already the
|
|
|
|
|
prevailing style (e.g. threading.py), to retain backwards
|
|
|
|
|
compatibility.
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
2018-05-24 14:53:55 -04:00
|
|
|
|
Function and Method Arguments
|
2012-03-15 03:18:38 -04:00
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
Always use ``self`` for the first argument to instance methods.
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
Always use ``cls`` for the first argument to class methods.
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
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 ``class_`` is better
|
|
|
|
|
than ``clss``. (Perhaps better is to avoid such clashes by using a
|
|
|
|
|
synonym.)
|
2004-03-27 15:14:19 -05:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
Method Names and Instance Variables
|
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
Use the function naming rules: lowercase with words separated by
|
|
|
|
|
underscores as necessary to improve readability.
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
Use one leading underscore only for non-public methods and instance
|
|
|
|
|
variables.
|
2004-03-29 20:12:22 -05:00
|
|
|
|
|
2012-03-15 03:18:38 -04: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
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
Python mangles these names with the class name: if class Foo has an
|
|
|
|
|
attribute named ``__a``, it cannot be accessed by ``Foo.__a``. (An
|
|
|
|
|
insistent 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.
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
Note: there is some controversy about the use of __names (see below).
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
Constants
|
|
|
|
|
~~~~~~~~~
|
2009-01-21 22:33:57 -05:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
Constants are usually defined on a module level and written in all
|
|
|
|
|
capital letters with underscores separating words. Examples include
|
|
|
|
|
``MAX_OVERFLOW`` and ``TOTAL``.
|
2009-01-21 22:33:57 -05:00
|
|
|
|
|
2018-07-07 19:20:37 -04:00
|
|
|
|
Designing for Inheritance
|
2012-03-15 03:18:38 -04:00
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~
|
2002-05-24 12:22:16 -04:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
Always decide whether a class's methods and instance variables
|
|
|
|
|
(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.
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
Public attributes are those that you expect unrelated clients of your
|
2018-05-24 14:53:55 -04:00
|
|
|
|
class to use, with your commitment to avoid backwards incompatible
|
2012-03-15 03:18:38 -04:00
|
|
|
|
changes. Non-public attributes are those that are not intended to be
|
|
|
|
|
used by third parties; you make no guarantees that non-public
|
|
|
|
|
attributes won't change or even be removed.
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
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
|
|
|
|
|
2012-03-15 03:18:38 -04: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
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
With this in mind, here are the Pythonic guidelines:
|
2002-05-24 12:22:16 -04:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
- Public attributes should have no leading underscores.
|
2002-05-24 12:22:16 -04:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
- If your public attribute name collides with a reserved keyword,
|
|
|
|
|
append a single trailing underscore to your attribute name. This is
|
|
|
|
|
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
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
Note 1: See the argument name recommendation above for class methods.
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
- 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.
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
2021-09-01 18:44:36 -04:00
|
|
|
|
Note 1: Try to keep the functional behavior side-effect free,
|
2012-03-15 03:18:38 -04:00
|
|
|
|
although side-effects such as caching are generally fine.
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
2021-09-01 18:44:36 -04:00
|
|
|
|
Note 2: Avoid using properties for computationally expensive
|
2012-03-15 03:18:38 -04:00
|
|
|
|
operations; the attribute notation makes the caller believe that
|
|
|
|
|
access is (relatively) cheap.
|
2005-12-14 17:10:16 -05:00
|
|
|
|
|
2012-03-15 03:18:38 -04: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.
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
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.
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
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
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
Note 3: Not everyone likes name mangling. Try to balance the
|
|
|
|
|
need to avoid accidental name clashes with potential use by
|
|
|
|
|
advanced callers.
|
2005-12-14 17:10:16 -05:00
|
|
|
|
|
2018-05-24 14:53:55 -04:00
|
|
|
|
Public and Internal Interfaces
|
2013-08-01 08:25:37 -04:00
|
|
|
|
------------------------------
|
|
|
|
|
|
|
|
|
|
Any backwards compatibility guarantees apply only to public interfaces.
|
|
|
|
|
Accordingly, it is important that users be able to clearly distinguish
|
|
|
|
|
between public and internal interfaces.
|
|
|
|
|
|
|
|
|
|
Documented interfaces are considered public, unless the documentation
|
|
|
|
|
explicitly declares them to be provisional or internal interfaces exempt
|
|
|
|
|
from the usual backwards compatibility guarantees. All undocumented
|
|
|
|
|
interfaces should be assumed to be internal.
|
|
|
|
|
|
|
|
|
|
To better support introspection, modules should explicitly declare the
|
|
|
|
|
names in their public API using the ``__all__`` attribute. Setting
|
|
|
|
|
``__all__`` to an empty list indicates that the module has no public API.
|
|
|
|
|
|
|
|
|
|
Even with ``__all__`` set appropriately, internal interfaces (packages,
|
|
|
|
|
modules, classes, functions, attributes or other names) should still be
|
|
|
|
|
prefixed with a single leading underscore.
|
|
|
|
|
|
|
|
|
|
An interface is also considered internal if any containing namespace
|
|
|
|
|
(package, module or class) is considered internal.
|
|
|
|
|
|
|
|
|
|
Imported names should always be considered an implementation detail.
|
|
|
|
|
Other modules must not rely on indirect access to such imported names
|
|
|
|
|
unless they are an explicitly documented part of the containing module's
|
|
|
|
|
API, such as ``os.path`` or a package's ``__init__`` module that exposes
|
|
|
|
|
functionality from submodules.
|
|
|
|
|
|
|
|
|
|
|
2002-05-24 15:39:47 -04:00
|
|
|
|
Programming Recommendations
|
2012-03-15 03:18:38 -04:00
|
|
|
|
===========================
|
|
|
|
|
|
|
|
|
|
- Code should be written in a way that does not disadvantage other
|
|
|
|
|
implementations of Python (PyPy, Jython, IronPython, Cython, Psyco,
|
|
|
|
|
and such).
|
2002-05-24 12:22:16 -04:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
For example, do not rely on CPython's efficient implementation of
|
|
|
|
|
in-place string concatenation for statements in the form ``a += b``
|
2013-08-01 08:25:37 -04:00
|
|
|
|
or ``a = a + b``. This optimization is fragile even in CPython (it
|
|
|
|
|
only works for some types) and isn't present at all in implementations
|
|
|
|
|
that don't use refcounting. In performance sensitive parts of the
|
|
|
|
|
library, the ``''.join()`` form should be used instead. This will
|
|
|
|
|
ensure that concatenation occurs in linear time across various
|
|
|
|
|
implementations.
|
2012-03-15 03:18:38 -04:00
|
|
|
|
|
|
|
|
|
- Comparisons to singletons like None should always be done with
|
|
|
|
|
``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 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!
|
2004-08-06 14:47:26 -04:00
|
|
|
|
|
2014-05-20 18:14:17 -04:00
|
|
|
|
- Use ``is not`` operator rather than ``not ... is``. While both
|
|
|
|
|
expressions are functionally identical, the former is more readable
|
2020-04-01 12:34:28 -04:00
|
|
|
|
and preferred::
|
2015-01-02 13:10:41 -05:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
# Correct:
|
2014-05-20 18:14:17 -04:00
|
|
|
|
if foo is not None:
|
2015-01-02 13:10:41 -05:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
::
|
2015-01-02 13:10:41 -05:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
# Wrong:
|
2014-05-20 18:14:17 -04:00
|
|
|
|
if not foo is None:
|
|
|
|
|
|
2012-03-15 03:18:38 -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.
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
To minimize the effort involved, the ``functools.total_ordering()``
|
|
|
|
|
decorator provides a tool to generate missing comparison methods.
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
2022-01-21 06:03:51 -05:00
|
|
|
|
:pep:`207` indicates that reflexivity rules *are* assumed by Python.
|
2012-03-15 03:18:38 -04:00
|
|
|
|
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.
|
2011-04-06 16:53:31 -04:00
|
|
|
|
|
2013-08-01 22:26:24 -04:00
|
|
|
|
- Always use a def statement instead of an assignment statement that binds
|
2020-04-01 12:34:28 -04:00
|
|
|
|
a lambda expression directly to an identifier::
|
2011-04-06 16:53:31 -04:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
# Correct:
|
2013-08-01 08:25:37 -04:00
|
|
|
|
def f(x): return 2*x
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
::
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
# Wrong:
|
2013-08-01 08:25:37 -04:00
|
|
|
|
f = lambda x: 2*x
|
|
|
|
|
|
|
|
|
|
The first form means that the name of the resulting function object is
|
|
|
|
|
specifically 'f' instead of the generic '<lambda>'. This is more
|
|
|
|
|
useful for tracebacks and string representations in general. The use
|
|
|
|
|
of the assignment statement eliminates the sole benefit a lambda
|
|
|
|
|
expression can offer over an explicit def statement (i.e. that it can
|
|
|
|
|
be embedded inside a larger expression)
|
|
|
|
|
|
|
|
|
|
- Derive exceptions from ``Exception`` rather than ``BaseException``.
|
|
|
|
|
Direct inheritance from ``BaseException`` is reserved for exceptions
|
|
|
|
|
where catching them is almost always the wrong thing to do.
|
2002-05-24 12:22:16 -04:00
|
|
|
|
|
2013-08-01 08:25:37 -04:00
|
|
|
|
Design exception hierarchies based on the distinctions that code
|
|
|
|
|
*catching* the exceptions is likely to need, rather than the locations
|
|
|
|
|
where the exceptions are raised. Aim to answer the question
|
|
|
|
|
"What went wrong?" programmatically, rather than only stating that
|
2022-01-21 06:03:51 -05:00
|
|
|
|
"A problem occurred" (see :pep:`3151` for an example of this lesson being
|
2013-08-01 08:25:37 -04:00
|
|
|
|
learned for the builtin exception hierarchy)
|
|
|
|
|
|
|
|
|
|
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 that are used for non-local flow control
|
2013-08-01 17:32:07 -04:00
|
|
|
|
or other forms of signaling need no special suffix.
|
2013-08-01 08:25:37 -04:00
|
|
|
|
|
2021-09-01 18:44:36 -04:00
|
|
|
|
- Use exception chaining appropriately. ``raise X from Y``
|
2013-08-01 08:25:37 -04:00
|
|
|
|
should be used to indicate explicit replacement without losing the
|
|
|
|
|
original traceback.
|
|
|
|
|
|
2021-09-01 18:44:36 -04:00
|
|
|
|
When deliberately replacing an inner exception (using ``raise X from
|
|
|
|
|
None``), ensure that relevant details are transferred to the new
|
|
|
|
|
exception (such as preserving the attribute name when converting
|
|
|
|
|
KeyError to AttributeError, or embedding the text of the original
|
|
|
|
|
exception in the new exception message).
|
2005-08-07 09:27:54 -04:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
- When catching exceptions, mention specific exceptions whenever
|
2018-07-07 19:20:37 -04:00
|
|
|
|
possible instead of using a bare ``except:`` clause::
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
try:
|
|
|
|
|
import platform_specific_module
|
|
|
|
|
except ImportError:
|
|
|
|
|
platform_specific_module = None
|
2007-02-01 16:09:28 -05:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
A bare ``except:`` clause will catch SystemExit and
|
|
|
|
|
KeyboardInterrupt exceptions, making it harder to interrupt a
|
2016-05-03 07:10:04 -04:00
|
|
|
|
program with Control-C, and can disguise other problems. If you
|
2012-03-15 03:18:38 -04:00
|
|
|
|
want to catch all exceptions that signal program errors, use
|
|
|
|
|
``except Exception:`` (bare except is equivalent to ``except
|
|
|
|
|
BaseException:``).
|
2007-02-01 16:09:28 -05:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
A good rule of thumb is to limit use of bare 'except' clauses to two
|
|
|
|
|
cases:
|
2007-02-01 16:09:28 -05:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
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.
|
2007-02-01 16:09:28 -05:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
2. If the code needs to do some cleanup work, but then lets the
|
|
|
|
|
exception propagate upwards with ``raise``. ``try...finally``
|
|
|
|
|
can be a better way to handle this case.
|
2007-02-01 16:09:28 -05:00
|
|
|
|
|
2013-08-01 08:25:37 -04:00
|
|
|
|
- When catching operating system errors, prefer the explicit exception
|
|
|
|
|
hierarchy introduced in Python 3.3 over introspection of ``errno``
|
|
|
|
|
values.
|
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
- Additionally, for all try/except clauses, limit the ``try`` clause
|
|
|
|
|
to the absolute minimum amount of code necessary. Again, this
|
2020-04-01 12:34:28 -04:00
|
|
|
|
avoids masking bugs::
|
2007-02-01 16:09:28 -05:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
# Correct:
|
2012-03-15 03:18:38 -04:00
|
|
|
|
try:
|
|
|
|
|
value = collection[key]
|
|
|
|
|
except KeyError:
|
|
|
|
|
return key_not_found(key)
|
|
|
|
|
else:
|
|
|
|
|
return handle_value(value)
|
2007-04-06 11:09:21 -04:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
::
|
2007-04-06 11:09:21 -04:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
# Wrong:
|
2012-03-15 03:18:38 -04:00
|
|
|
|
try:
|
|
|
|
|
# Too broad!
|
|
|
|
|
return handle_value(collection[key])
|
|
|
|
|
except KeyError:
|
|
|
|
|
# Will also catch KeyError raised by handle_value()
|
|
|
|
|
return key_not_found(key)
|
2007-04-06 11:09:21 -04:00
|
|
|
|
|
2013-08-01 08:25:37 -04:00
|
|
|
|
- When a resource is local to a particular section of code, use a
|
|
|
|
|
``with`` statement to ensure it is cleaned up promptly and reliably
|
|
|
|
|
after use. A try/finally statement is also acceptable.
|
|
|
|
|
|
2012-04-24 08:08:00 -04:00
|
|
|
|
- Context managers should be invoked through separate functions or methods
|
2020-04-01 12:34:28 -04:00
|
|
|
|
whenever they do something other than acquire and release resources::
|
2012-04-28 03:51:37 -04:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
# Correct:
|
2018-07-07 19:20:37 -04:00
|
|
|
|
with conn.begin_transaction():
|
|
|
|
|
do_stuff_in_transaction(conn)
|
2012-04-24 02:34:26 -04:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
::
|
2012-04-28 03:51:37 -04:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
# Wrong:
|
2018-07-07 19:20:37 -04:00
|
|
|
|
with conn:
|
|
|
|
|
do_stuff_in_transaction(conn)
|
2012-04-24 02:34:26 -04:00
|
|
|
|
|
2012-04-28 03:51:37 -04:00
|
|
|
|
The latter example doesn't provide any information to indicate that
|
2016-06-02 22:13:50 -04:00
|
|
|
|
the ``__enter__`` and ``__exit__`` methods are doing something other
|
|
|
|
|
than closing the connection after a transaction. Being explicit is
|
2012-04-28 03:51:37 -04:00
|
|
|
|
important in this case.
|
2012-04-24 02:34:26 -04:00
|
|
|
|
|
2015-04-06 21:07:10 -04:00
|
|
|
|
- Be consistent in return statements. Either all return statements in
|
|
|
|
|
a function should return an expression, or none of them should. If
|
|
|
|
|
any return statement returns an expression, any return statements
|
|
|
|
|
where no value is returned should explicitly state this as ``return
|
|
|
|
|
None``, and an explicit return statement should be present at the
|
2020-04-01 12:34:28 -04:00
|
|
|
|
end of the function (if reachable)::
|
2015-04-06 21:07:10 -04:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
# Correct:
|
2015-04-06 21:07:10 -04:00
|
|
|
|
|
|
|
|
|
def foo(x):
|
|
|
|
|
if x >= 0:
|
|
|
|
|
return math.sqrt(x)
|
|
|
|
|
else:
|
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
def bar(x):
|
|
|
|
|
if x < 0:
|
|
|
|
|
return None
|
|
|
|
|
return math.sqrt(x)
|
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
::
|
|
|
|
|
|
|
|
|
|
# Wrong:
|
2015-04-06 21:07:10 -04:00
|
|
|
|
|
|
|
|
|
def foo(x):
|
|
|
|
|
if x >= 0:
|
|
|
|
|
return math.sqrt(x)
|
|
|
|
|
|
|
|
|
|
def bar(x):
|
|
|
|
|
if x < 0:
|
|
|
|
|
return
|
|
|
|
|
return math.sqrt(x)
|
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
- Use ``''.startswith()`` and ``''.endswith()`` instead of string
|
|
|
|
|
slicing to check for prefixes or suffixes.
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
2018-07-07 19:20:37 -04:00
|
|
|
|
startswith() and endswith() are cleaner and less error prone::
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
# Correct:
|
|
|
|
|
if foo.startswith('bar'):
|
|
|
|
|
|
|
|
|
|
::
|
|
|
|
|
|
|
|
|
|
# Wrong:
|
|
|
|
|
if foo[:3] == 'bar':
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
- Object type comparisons should always use isinstance() instead of
|
2020-04-01 12:34:28 -04:00
|
|
|
|
comparing types directly::
|
|
|
|
|
|
|
|
|
|
# Correct:
|
|
|
|
|
if isinstance(obj, int):
|
2002-05-24 12:22:16 -04:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
::
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
# Wrong:
|
|
|
|
|
if type(obj) is type(1):
|
2002-05-24 12:22:16 -04:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
- For sequences, (strings, lists, tuples), use the fact that empty
|
2020-04-01 12:34:28 -04:00
|
|
|
|
sequences are false::
|
|
|
|
|
|
|
|
|
|
# Correct:
|
|
|
|
|
if not seq:
|
|
|
|
|
if seq:
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
::
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
# Wrong:
|
|
|
|
|
if len(seq):
|
|
|
|
|
if not len(seq):
|
2002-05-24 12:22:16 -04:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
- Don't write string literals that rely on significant trailing
|
|
|
|
|
whitespace. Such trailing whitespace is visually indistinguishable
|
|
|
|
|
and some editors (or more recently, reindent.py) will trim them.
|
2002-05-24 15:46:20 -04:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
- Don't compare boolean values to True or False using ``==``::
|
|
|
|
|
|
|
|
|
|
# Correct:
|
|
|
|
|
if greeting:
|
|
|
|
|
|
|
|
|
|
::
|
2005-12-14 17:54:57 -05:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
# Wrong:
|
|
|
|
|
if greeting == True:
|
|
|
|
|
|
|
|
|
|
Worse::
|
|
|
|
|
|
|
|
|
|
# Wrong:
|
|
|
|
|
if greeting is True:
|
2002-05-24 15:39:47 -04:00
|
|
|
|
|
2019-09-23 10:14:57 -04:00
|
|
|
|
- Use of the flow control statements ``return``/``break``/``continue``
|
|
|
|
|
within the finally suite of a ``try...finally``, where the flow control
|
|
|
|
|
statement would jump outside the finally suite, is discouraged. This
|
|
|
|
|
is because such statements will implicitly cancel any active exception
|
2020-04-01 12:34:28 -04:00
|
|
|
|
that is propagating through the finally suite::
|
2019-09-23 10:14:57 -04:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
# Wrong:
|
2019-09-23 10:14:57 -04:00
|
|
|
|
def foo():
|
|
|
|
|
try:
|
|
|
|
|
1 / 0
|
|
|
|
|
finally:
|
|
|
|
|
return 42
|
|
|
|
|
|
2016-01-05 13:33:30 -05:00
|
|
|
|
Function Annotations
|
|
|
|
|
--------------------
|
2012-04-23 00:32:34 -04:00
|
|
|
|
|
2022-01-21 06:03:51 -05:00
|
|
|
|
With the acceptance of :pep:`484`, the style rules for function
|
2021-09-01 18:44:36 -04:00
|
|
|
|
annotations have changed.
|
2013-08-01 08:25:37 -04:00
|
|
|
|
|
2022-05-11 13:45:05 -04:00
|
|
|
|
- Function annotations should use :pep:`484` syntax (there are some
|
2021-09-01 18:44:36 -04:00
|
|
|
|
formatting recommendations for annotations in the previous section).
|
2012-04-23 00:32:34 -04:00
|
|
|
|
|
2016-01-05 13:33:30 -05:00
|
|
|
|
- The experimentation with annotation styles that was recommended
|
|
|
|
|
previously in this PEP is no longer encouraged.
|
2012-04-23 00:32:34 -04:00
|
|
|
|
|
2022-01-21 06:03:51 -05:00
|
|
|
|
- However, outside the stdlib, experiments within the rules of :pep:`484`
|
2016-01-05 18:25:40 -05:00
|
|
|
|
are now encouraged. For example, marking up a large third party
|
2022-01-21 06:03:51 -05:00
|
|
|
|
library or application with :pep:`484` style type annotations,
|
2016-01-05 18:25:40 -05:00
|
|
|
|
reviewing how easy it was to add those annotations, and observing
|
2016-07-11 11:14:08 -04:00
|
|
|
|
whether their presence increases code understandability.
|
2012-04-23 00:32:34 -04:00
|
|
|
|
|
2016-01-05 13:33:30 -05:00
|
|
|
|
- The Python standard library should be conservative in adopting such
|
|
|
|
|
annotations, but their use is allowed for new code and for big
|
|
|
|
|
refactorings.
|
2012-04-23 00:32:34 -04:00
|
|
|
|
|
2016-01-05 13:33:30 -05:00
|
|
|
|
- For code that wants to make a different use of function annotations
|
|
|
|
|
it is recommended to put a comment of the form::
|
2012-04-23 00:32:34 -04:00
|
|
|
|
|
2018-07-07 19:20:37 -04:00
|
|
|
|
# type: ignore
|
2012-04-23 00:32:34 -04:00
|
|
|
|
|
2021-09-01 18:44:36 -04:00
|
|
|
|
near the top of the file; this tells type checkers to ignore all
|
2016-01-05 13:33:30 -05:00
|
|
|
|
annotations. (More fine-grained ways of disabling complaints from
|
2022-01-21 06:03:51 -05:00
|
|
|
|
type checkers can be found in :pep:`484`.)
|
2012-04-23 00:32:34 -04:00
|
|
|
|
|
2016-01-05 13:33:30 -05:00
|
|
|
|
- Like linters, type checkers are optional, separate tools. Python
|
|
|
|
|
interpreters by default should not issue any messages due to type
|
|
|
|
|
checking and should not alter their behavior based on annotations.
|
2012-04-23 00:32:34 -04:00
|
|
|
|
|
2016-01-05 13:33:30 -05:00
|
|
|
|
- Users who don't want to use type checkers are free to ignore them.
|
2016-01-05 18:25:40 -05:00
|
|
|
|
However, it is expected that users of third party library packages
|
|
|
|
|
may want to run type checkers over those packages. For this purpose
|
2022-01-21 06:03:51 -05:00
|
|
|
|
:pep:`484` recommends the use of stub files: .pyi files that are read
|
2016-01-05 18:25:40 -05:00
|
|
|
|
by the type checker in preference of the corresponding .py files.
|
|
|
|
|
Stub files can be distributed with a library, or separately (with
|
2016-04-15 12:43:52 -04:00
|
|
|
|
the library author's permission) through the typeshed repo [5]_.
|
2012-04-23 00:32:34 -04:00
|
|
|
|
|
|
|
|
|
|
2018-07-07 19:20:37 -04:00
|
|
|
|
Variable Annotations
|
2018-01-18 22:33:13 -05:00
|
|
|
|
--------------------
|
|
|
|
|
|
2022-01-21 06:03:51 -05:00
|
|
|
|
:pep:`526` introduced variable annotations. The style recommendations for them are
|
2018-01-18 22:33:13 -05:00
|
|
|
|
similar to those on function annotations described above:
|
|
|
|
|
|
|
|
|
|
- Annotations for module level variables, class and instance variables,
|
|
|
|
|
and local variables should have a single space after the colon.
|
|
|
|
|
|
|
|
|
|
- There should be no space before the colon.
|
|
|
|
|
|
|
|
|
|
- If an assignment has a right hand side, then the equality sign should have
|
2020-04-01 12:34:28 -04:00
|
|
|
|
exactly one space on both sides::
|
2018-01-18 22:33:13 -05:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
# Correct:
|
2018-01-18 22:33:13 -05:00
|
|
|
|
|
2018-07-07 19:20:37 -04:00
|
|
|
|
code: int
|
2018-01-18 22:33:13 -05:00
|
|
|
|
|
2018-07-07 19:20:37 -04:00
|
|
|
|
class Point:
|
|
|
|
|
coords: Tuple[int, int]
|
|
|
|
|
label: str = '<unknown>'
|
2018-01-18 22:33:13 -05:00
|
|
|
|
|
2020-04-01 12:34:28 -04:00
|
|
|
|
::
|
|
|
|
|
|
|
|
|
|
# Wrong:
|
2018-01-18 22:33:13 -05:00
|
|
|
|
|
2018-07-07 19:20:37 -04:00
|
|
|
|
code:int # No space after colon
|
|
|
|
|
code : int # Space before colon
|
2018-01-18 22:33:13 -05:00
|
|
|
|
|
2018-07-07 19:20:37 -04:00
|
|
|
|
class Test:
|
|
|
|
|
result: int=0 # No spaces around equality sign
|
2018-01-18 22:33:13 -05:00
|
|
|
|
|
2022-01-21 06:03:51 -05:00
|
|
|
|
- Although the :pep:`526` is accepted for Python 3.6, the variable annotation
|
2018-01-18 22:33:13 -05:00
|
|
|
|
syntax is the preferred syntax for stub files on all versions of Python
|
2022-01-21 06:03:51 -05:00
|
|
|
|
(see :pep:`484` for details).
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2014-04-27 13:34:33 -04:00
|
|
|
|
.. rubric:: Footnotes
|
|
|
|
|
|
|
|
|
|
.. [#fn-hi] *Hanging indentation* is a type-setting style where all
|
|
|
|
|
the lines in a paragraph are indented except the first line. In
|
|
|
|
|
the context of Python, the term is used to describe a style where
|
|
|
|
|
the opening parenthesis of a parenthesized statement is the last
|
|
|
|
|
non-whitespace character of the line, with subsequent lines being
|
|
|
|
|
indented until the closing parenthesis.
|
|
|
|
|
|
|
|
|
|
|
2001-07-05 14:56:12 -04:00
|
|
|
|
References
|
2012-03-15 03:18:38 -04:00
|
|
|
|
==========
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2012-10-27 17:33:29 -04:00
|
|
|
|
.. [2] Barry's GNU Mailman style guide
|
2012-03-15 03:18:38 -04:00
|
|
|
|
http://barry.warsaw.us/software/STYLEGUIDE.txt
|
2005-12-14 16:12:58 -05:00
|
|
|
|
|
2016-04-20 02:14:50 -04:00
|
|
|
|
.. [3] Donald Knuth's *The TeXBook*, pages 195 and 196.
|
2016-04-15 12:43:52 -04:00
|
|
|
|
|
|
|
|
|
.. [4] http://www.wikipedia.com/wiki/CamelCase
|
2005-12-14 17:10:16 -05:00
|
|
|
|
|
2016-04-15 12:43:52 -04:00
|
|
|
|
.. [5] Typeshed repo
|
2016-01-05 13:33:30 -05:00
|
|
|
|
https://github.com/python/typeshed
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2001-07-05 14:56:12 -04:00
|
|
|
|
Copyright
|
2012-03-15 03:18:38 -04:00
|
|
|
|
=========
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
This document has been placed in the public domain.
|
2001-07-05 14:56:12 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2012-03-15 03:18:38 -04:00
|
|
|
|
..
|
|
|
|
|
Local Variables:
|
|
|
|
|
mode: indented-text
|
|
|
|
|
indent-tabs-mode: nil
|
|
|
|
|
sentence-end-double-space: t
|
|
|
|
|
fill-column: 70
|
|
|
|
|
coding: utf-8
|
|
|
|
|
End:
|