PEP 8 - The Style Guide For Python Code
PEP 8 - The Style Guide For Python Code
Introduction
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.
This document and PEP 257 (Docstring Conventions) were adapted from
Guido’s original Python Style Guide essay, with some additions from Barry’s style
guide 2.
This style guide evolves over time as additional conventions are identified and
past conventions are rendered obsolete by changes in the language itself.
Many projects have their own coding style guidelines. In the event of any
conflicts, such project-specific guides take precedence for that project.
[Link] 1/38
10/01/22, 13:08 PEP 8: The Style Guide for Python Code
code and make it consistent across the wide spectrum of Python code. As PEP
20 says, “Readability counts”.
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 the most important.
In particular: do not break backwards compatibility just to comply with this PEP!
1. When applying the guideline would make the code less readable, even for
someone who is used to reading code that follows this PEP.
4. When the code needs to remain compatible with older versions of Python
that don’t support the feature recommended by the style guide.
Code lay-out
Indentation
Use 4 spaces per indentation level.
[Link] 2/38
10/01/22, 13:08 PEP 8: The Style Guide for Python Code
Yes:
At the:
Optional:
[Link] 3/38
10/01/22, 13:08 PEP 8: The Style Guide for Python Code
var_one, var_two,
··var_three,·var_four)
# No extra indentation.
if·(this_is_one_thing·and
····that_is_another_thing):
····do_something()
(Also see the discussion of whether to break before or after binary operators
below.)
my_list·=·[
····1,·2,·3,
[Link] 4/38
10/01/22, 13:08 PEP 8: The Style Guide for Python Code
····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 starts the multi-line
construct, as in:
my_list·=·[
····1,·2,·3,
····4,·5,·6,
]
result·=·some_function_that_takes_arguments(
····'a',·'b',·'c',
····'d',·'e',·'f',
)
Tabs or Spaces?
Spaces are the preferred indentation method.
Tabs should be used solely to remain consistent with code that is already
indented with tabs.
Python 3 disallows mixing the use of tabs and spaces for indentation.
Python 2 code indented with a mixture of tabs and spaces should be converted
to using spaces exclusively.
When invoking the Python 2 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!
For flowing long blocks of text with fewer structural restrictions (docstrings or
comments), the line length should be limited to 72 characters.
Limiting the required editor window width makes it possible to have several files
open side-by-side, and works well when using code 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 avoid wrapping
in editors with the window width set to 80, even 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.
Some teams strongly prefer a longer line length. For code maintained exclusively
or primarily by a team that can reach agreement on this issue, it is okay to
increase the nominal line length from 80 to 100 characters (effectively
increasing the maximum length to 99 characters), provided that comments and
docstrings are still wrapped at 72 characters.
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 for line continuation.
Backslashes may still be appropriate at times. For example, long, multiple with -
statements cannot use implicit continuation, so backslashes are acceptable:
with·open('/path/to/some/file/you/want/to/read')·as·file_1,·\
·····open('/path/to/some/file/being/written',·'w')·as·file_2:
····file_2.write(file_1.read())
[Link] 6/38
10/01/22, 13:08 PEP 8: The Style Guide for Python Code
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:
Following the tradition from mathematics usually results in more readable code:
[Link] 7/38
10/01/22, 13:08 PEP 8: The Style Guide for Python Code
Blank Lines
Surround top-level function and class definitions with two blank lines.
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).
Python accepts the control-L (i.e. ^L) form feed character as whitespace; Many
tools treat these characters as page separators, so 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.
Files using ASCII (in Python 2) or UTF-8 (in Python 3) should not have an
encoding declaration.
In the standard library, non-default encodings should be used only for test
purposes or when a comment or docstring needs to mention an author name
that contains non-ASCII characters; otherwise, using \x , \u , \U , or \N escapes
is the preferred way to include non-ASCII data in string literals.
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
[Link] 8/38
10/01/22, 13:08 PEP 8: The Style Guide for Python Code
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.
Imports
Imports should usually be on separate lines, e.g.:
Yes:
import·os
import·sys
At the:
import·os,·sys
from·subprocess·import·Popen,·PIPE
Imports are always put at the top of the file, just after any module
comments and docstrings, and before module globals and constants.
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 [Link] ):
import·[Link]
from·mypkg·import·sibling
from·[Link]·import·example
from·.·import·sibling
from·.sibling·import·example
Standard library code should avoid complex package layouts and always use
absolute imports.
Implicit relative imports should never be used and have been removed in
Python 3.
from·myclass·import·MyClass
from·[Link]·import·YourClass
import·myclass
import·[Link]
When republishing names this way, the guidelines below regarding public
and internal interfaces still apply.
For example:
from·__future__·import·barry_as_FLUFL
__all__·=·['a',·'b',·'c']
__version__·=·'0.1'
__author__·=·'Cardinal Biggles'
import·os
import·sys
String Quotes
[Link] 11/38
10/01/22, 13:08 PEP 8: The Style Guide for Python Code
In Python, single-quoted strings and double-quoted strings are the same. This
PEP does not make a recommendation for this. Pick a rule and stick to it. When a
string contains single or double quote characters, however, use the other one to
avoid backslashes in the string. It improves readability.
Yes:
spam(ham[1],·{eggs:·2})
At the:
spam(·ham[·1·],·{·eggs:·2·}·)
Yes:
foo·=·(0,)
At the:
bar·=·(0,·)
[Link] 12/38
10/01/22, 13:08 PEP 8: The Style Guide for Python Code
Yes:
if·x·==·4:·print·x,·y;·x,·y·=·y,·x
At the:
if·x·==·4·:·print·x·,·y·;·x·,·y·=·y·,·x
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: when a slice parameter is omitted, the space is
omitted.
Yes:
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]
At the:
ham[lower·+·offset:upper·+·offset]
ham[1:·9],·ham[1·:9],·ham[1:9·:3]
ham[lower·:·:·upper]
ham[·:·upper]
Immediately before the open parenthesis that starts the argument list of a
function call:
Yes:
[Link] 13/38
10/01/22, 13:08 PEP 8: The Style Guide for Python Code
spam(1)
At the:
spam·(1)
Yes:
dct['key']·=·lst[index]
At the:
dct·['key']·=·lst·[index]
More than one space around an assignment (or other) operator to align it
with another.
Yes:
x·=·1
y·=·2
long_variable·=·3
At the:
x·············=·1
y·············=·2
long_variable·=·3
Other Recommendations
[Link] 14/38
10/01/22, 13:08 PEP 8: The Style Guide for Python Code
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 ).
Yes:
i·=·i·+·1
submitted·+=·1
x·=·x*2·-·1
hypot2·=·x*x·+·y*y
c·=·(a+b)·*·(a-b)
At the:
i=i+1
submitted·+=1
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 keyword
argument or a default parameter value.
Yes:
def·complex(real,·imag=0.0):
····return·magic(r=real,·i=imag)
[Link] 15/38
10/01/22, 13:08 PEP 8: The Style Guide for Python Code
At the:
def·complex(real,·imag·=·0.0):
····return·magic(r·=·real,·i·=·imag)
Function annotations should use the normal rules for colons and always
have spaces around the -> arrow if present. (See Function Annotations
below for more about function annotations.)
Yes:
def·munge(input:·AnyStr):·...
def·munge()·->·AnyStr:·...
At the:
def·munge(input:AnyStr):·...
def·munge()->PosInt:·...
Yes:
def·munge(sep:·AnyStr·=·None):·...
def·munge(input:·AnyStr,·sep:·AnyStr·=·None,·limit=1000):·...
At the:
def·munge(input:·AnyStr=None):·...
def·munge(input:·AnyStr,·limit·=·1000):·...
[Link] 16/38
10/01/22, 13:08 PEP 8: The Style Guide for Python Code
Yes:
if·foo·==·'blah':
····do_blah_thing()
do_one()
do_two()
do_three()
Rather not:
if·foo·==·'blah':·do_blah_thing()
do_one();·do_two();·do_three()
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()
[Link] 17/38
10/01/22, 13:08 PEP 8: The Style Guide for Python Code
Yes:
FILES·=·('[Link]',)
FILES·=·'[Link]',
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 tuples).
Yes:
FILES·=·[
····'[Link]',
····'[Link]',
····]
initialize(FILES,
···········error=True,
···········)
At the:
[Link] 18/38
10/01/22, 13:08 PEP 8: The Style Guide for Python Code
FILES·=·['[Link]',·'[Link]',]
initialize(FILES,·error=True,)
Comments
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!
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.
Block Comments
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).
Inline Comments
Use inline comments sparingly.
[Link] 19/38
10/01/22, 13:08 PEP 8: The Style Guide for Python Code
Inline comments are unnecessary and in fact distracting if they state the
obvious.
Don’t do this:
x·=·x·+·1·················# Increment x
Documentation Strings
Conventions for writing good documentation strings (a.k.a. “docstrings”) are
immortalized in PEP 257.
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.
PEP 257 describes good docstring conventions. Note that most importantly,
the """ that ends a multiline docstring should be on a line by itself, e.g.:
"""Return a foobang
For one liner docstrings, please keep the closing """ on the same line.
[Link] 20/38
10/01/22, 13:08 PEP 8: The Style Guide for Python Code
Naming Conventions
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.
Overriding Principle
Names that are visible to the user as public parts of the API should follow
conventions that reflect usage rather than implementation.
Note:
When using abbreviations in CapWords, capitalize all the letters of the abbreviation.
Thus HTTPServerError is better than HttpServerError .
[Link] 21/38
10/01/22, 13:08 PEP 8: The Style Guide for Python Code
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 [Link]() function returns a tuple whose items traditionally
have names like st_mode , st_size , st_mtime and so on. (This is done to
emphasize the 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):
[Link](master,·class_='ClassName')
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 one and
zero. When tempted to use ‘l’, use ‘L’ instead.
ASCII Compatibility
Identifiers used in the standard library must be ASCII compatible as described in
the policy section of PEP 3131.
Class Names
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.
[Link] 23/38
10/01/22, 13:08 PEP 8: The Style Guide for Python Code
from·typing·import·TypeVar
··VT_co·=·TypeVar('VT_co',·covariant=True)
··KT_contra·=·TypeVar('KT_contra',·contravariant=True)
Exception Names
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).
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”).
Function Names
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. [Link]), to retain backwards compatibility.
Use one leading underscore only for non-public methods and instance variables.
To avoid name clashes with subclasses, use two leading underscores to invoke
Python’s name mangling rules.
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.
Note: there is some controversy about the use of __names (see below).
Constants
Constants are usually defined on a module level and written in all capital letters
with underscores separating words. Examples include MAX_OVERFLOW and TOTAL .
Public attributes are those that you expect unrelated clients of your class to use,
with your commitment to avoid backward incompatible changes. Non-public
[Link] 25/38
10/01/22, 13:08 PEP 8: The Style Guide for Python Code
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.
We don’t use the term “private” here, since no attribute is really private in
Python (without a generally unnecessary amount of work).
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.
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 2: Try to keep the functional behavior side-effect free, although side-
effects such as caching are generally fine.
[Link] 26/38
10/01/22, 13:08 PEP 8: The Style Guide for Python Code
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.
Note 3: Not everyone likes name mangling. Try to balance the need to avoid
accidental name clashes with potential use by advanced callers.
[Link] 27/38
10/01/22, 13:08 PEP 8: The Style Guide for Python Code
Programming Recommendations
Code should be written in a way that does not disadvantage other
implementations of Python (PyPy, Jython, IronPython, Cython, Psyco, and
such).
[Link] 28/38
10/01/22, 13:08 PEP 8: The Style Guide for Python Code
Use is not operator rather than not ... is . While both expressions are
functionally identical, the former is more readable and preferred.
Yes:
if·foo·is·not·None:
At the:
if·not·foo·is·None:
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.
Yes:
def·f(x):·return·2*x
At the:
[Link] 29/38
10/01/22, 13:08 PEP 8: The Style Guide for Python Code
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)
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 or other forms of
signaling need no special suffix.
[Link] 30/38
10/01/22, 13:08 PEP 8: The Style Guide for Python Code
The paren-using form also means that when the exception arguments are
long or include string formatting, you don’t need to use line continuation
characters thanks to the containing parentheses.
try:
····import·platform_specific_module
except·ImportError:
····platform_specific_module·=·None
A good rule of thumb is to limit use of bare ‘except’ clauses to two cases:
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.
[Link] 31/38
10/01/22, 13:08 PEP 8: The Style Guide for Python Code
try:
····process_data()
except·Exception·as·exc:
····raise·DataProcessingFailedError(str(exc))
This is the only syntax supported in Python 3, and avoids the ambiguity
problems associated with the older comma-based syntax.
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)
At the:
try:
····# Too broad!
····return·handle_value(collection[key])
except·KeyError:
····# Will also catch KeyError raised by handle_value()
····return·key_not_found(key)
[Link] 32/38
10/01/22, 13:08 PEP 8: The Style Guide for Python Code
Yes:
with·conn.begin_transaction():
····do_stuff_in_transaction(conn)
At the:
with·conn:
····do_stuff_in_transaction(conn)
The latter example doesn’t provide any information to indicate that the
__enter__ and __exit__ methods are doing something other than closing
the connection after a transaction. Being explicit is important in this case.
Yes:
def·foo(x):
····if·x·>=·0:
········return·[Link](x)
····else:
········return·None
def·bar(x):
····if·x·<·0:
········return·None
····return·[Link](x)
At the:
[Link] 33/38
10/01/22, 13:08 PEP 8: The Style Guide for Python Code
def·foo(x):
····if·x·>=·0:
········return·[Link](x)
def·bar(x):
····if·x·<·0:
········return
····return·[Link](x)
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.
startswith() and endswith() are cleaner and less error prone. For
example:
Yes:
if·[Link]('bar'):
At the:
if·foo[:3]·==·'bar':
Yes:
if·isinstance(obj,·int):
[Link] 34/38
10/01/22, 13:08 PEP 8: The Style Guide for Python Code
At the:
if·type(obj)·is·type(1):
if·isinstance(obj,·basestring):
For sequences, (strings, lists, tuples), use the fact that empty sequences are
false:
Yes:
if·not·seq:
if·seq:
At the:
if·len(seq):
if·not·len(seq):
Don’t write string literals that rely on significant trailing whitespace. Such
trailing whitespace is visually indistinguishable and some editors (or more
recently, [Link]) will trim them.
Don’t compare boolean values to True or False using == :
Yes:
if·greeting:
[Link] 35/38
10/01/22, 13:08 PEP 8: The Style Guide for Python Code
At the:
if·greeting·==·True:
Worse:
if·greeting·is·True:
Function Annotations
With the acceptance of PEP 484, the style rules for function annotations are
changing.
However, outside the stdlib, experiments within the rules of PEP 484 are
now encouraged. For example, marking up a large third party library or
application with PEP 484 style type annotations, reviewing how easy it was
to add those annotations, and observing whether their presence increases
code understandability.
# type: ignore
[Link] 36/38
10/01/22, 13:08 PEP 8: The Style Guide for Python Code
near the top of the file; this tells type checker to ignore all annotations.
(More fine-grained ways of disabling complaints from type checkers can be
found in PEP 484.)
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.
Users who don’t want to use type checkers are free to ignore them.
However, it is expected that users of third party library packages may want
to run type checkers over those packages. For this purpose PEP 484
recommends the use of stub files: .pyi files that are read by the type checker
in preference of the corresponding .py files. Stub files can be distributed
with a library, or separately (with the library author’s permission) through
the typeshed repo 6.
Footnotes
1.
PEP 7, Style Guide for C Code, van Rossum↩
2.
Barry’s GNU Mailman style guide
[Link]
3.
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.↩
[Link] 37/38
10/01/22, 13:08 PEP 8: The Style Guide for Python Code
4.
Donald Knuth's The TeXBook, pages 195 and 196.↩
5.
[Link] ↩
6.
Typeshed repo [Link]
7.
Suggested syntax for Python 2.7 and straddling code
[Link]
python-2-7-and-straddling-code↩
Copyright
[Link] 38/38