blob: ca28eb778c315f1fa9f648f10cc396a158065af4 [file] [log] [blame] [view]
# Python style guide
The Fuchsia project follows the [Google Python style guide](https://github.com/google/styleguide/blob/gh-pages/pyguide.md){:.external},
with a few [refinements](#refinements).
The Google Python style guide allows more variation (presumably to cover a large
breadth of existing source). This guide has a tighter set of choices. So a
Fuchsia Python file will also comply with the Google style guide, but a Google
Python file might not comply with this guide. See [refinements](#refinements)
below for details.
## Python versions {#python-versions}
### Scripts invoked by the build
Scripts invoked by the build (GN or Ninja) should use `python3.8` in the shebang:
`#!/usr/bin/env python3.8`.
Both `fx` and the continuous integration infrastructure ensure that that
executable will be in the path during GN and Ninja invocations, so it's safe to
use in that context.
### Other scripts
Scripts which are invoked directly should use `python` in the shebang and be
compatible with both 2 and 3: `#!/usr/bin/env python`.
Developers working on Fuchsia modules may use various platforms. Some platforms
include Python 2.x and not Python 3.x and vice versa. Until Python 3.x is
included in the prominent development environments we support, we should support
Python 2.x.
While Python 2.x is supported, test scripts on both versions. Python 2.7 will be
supported by the Python team until January 1, 2020. When we drop Python 2.7
support will be influenced by, but not dictated by that support pledge from the
Python team.
## Multiple Inheritance
Multiple inheritance is strongly discouraged. This is for the same reason
listed in the
[Google C++ style guide: risk of "diamond" inheritance](https://google.github.io/styleguide/cppguide.html#Inheritance){:.external}
patterns, which are prone to confusion. If a case is found where avoiding
multiple inheritance is unreasonable, all classes involved must initially
inherit from the base class `object`, which governs which multiple inheritance
scheme is used.
## Use Unicode for Text
In scripts that support Python 2.x (see [Python versions](#python-versions)),
explicitly declare text strings as unicode and binary data as bytes, using
`u""`, `unicode()`, `unichr()` and `b""`, `bytes()`, `byte()` respectively.
Python 3.x defaults to using Unicode for strings, so this guideline will be
removed when support for Python 2 is dropped.
```python {.good}
Yes:
a = u"Hello" # Unicode constant.
b = unicode(foo) # Convert to Unicode.
c = unichr(c) # Convert to Unicode.
d = io.open("bar.txt").read() # Read text as Unicode.
```
```python {.bad}
No:
a = "Hello" # Ambiguous (depends on Python version).
b = str(foo) # Convert to ascii.
c = chr(c) # Convert to ascii.
d = open("bar.txt").read() # Read text as ascii.
```
## Refinements
The following refinements we make to the Google Python style guide are largely
choices between variations. For example, if the style guide says you may do A,
B, or C we may choose to favor B and avoid the other choices.
### Indentation
Avoid aligning with opening delimiter. Prefer instead to indent using fixed
(4 space) indentation.
(See
[Indentation](https://github.com/google/styleguide/blob/gh-pages/pyguide.md#34-indentation){:.external}
in the Google Python style guide for comparison.)
### Statements
Avoid creating single line statements, even with `if` statements.
```python {.good}
Yes:
if foo:
bar(foo)
```
```python {.bad}
No:
if foo: bar(foo)
```
(See
[Statements](https://github.com/google/styleguide/blob/gh-pages/pyguide.md#314-statements){:.external}
in the Google Python style guide for comparison.)
### Type annotations
In scripts that support Python 2.x (see [Python versions](#python-versions)),
type annotations will not be used.
(See
[Type Annotations](https://github.com/google/styleguide/blob/gh-pages/pyguide.md#319-type-annotations){:.external}
in the Google Python style guide for comparison.)
### Strings
Prefer double quotes for strings (`"`). Use single quotes when the declaration is
more readable with single quotes. For example, `'The cat said "Meow"'` is more readable
than `"The cat said \\"Meow\\""`.
(See
[Strings](https://github.com/google/styleguide/blob/gh-pages/pyguide.md#310-strings){:.external}
in the Google Python style guide for comparison.)
### Be consistent
Be consistent within a large scope. Avoid displaying small pockets of consistency
within Fuchsia. Being consistent within only a single file or directory is not
consistency.
Within `third_party`, the intent is to follow the existing style for that project
or library. Look for a style guide within that library as appropriate.
(See
[Parting Words](https://github.com/google/styleguide/blob/gh-pages/pyguide.md#4-parting-words){:.external}
in the Google Python style guide.)