blob: 54543fe9430111aabe802d2b4aab5828569247de [file] [log] [blame] [view]
Andrew Grieve32bc5e0d2020-01-03 19:39:521# Chromium Python Style Guide
Peter Wendcdb2ec2018-11-26 23:00:362
3_For other languages, please see the [Chromium style
John Palmerbe051302021-05-19 11:48:354guides](https://chromium.googlesource.com/chromium/src/+/main/styleguide/styleguide.md)._
Peter Wendcdb2ec2018-11-26 23:00:365
Dirk Prankecc232342021-05-13 22:20:126As of 2021-05-12, Chromium is transitioning from Python 2 to Python 3 (follow
7[crbug.com/941669](https://crbug.com/941669) for updates). See
8[//docs/python3_migration.md](../docs/python3_migration.md) for more on
9how to migrate code.
10
11For new (Python 3) code, you can assume Python 3.8 (and that's what the bots
12will use), but we are increasingly seeing people running 3.9 locally as well.
13
14We (often) use a tool called [vpython] to manage Python packages; vpython
15is a wrapper around virtualenv. However, it is not safe to use vpython
16regardless of context, as it can have performance issues. All tests are
17run under vpython, so it is safe there, but you should not use vpython
18during PRESUBMIT checks, gclient runhooks, or during the build unless
19a [//build/OWNER](../../build/OWNERS) has told you that it is okay to do so.
20
21Also, there is some performance overhead to using vpython, so prefer not
22to use vpython unless you need it (to pick up packages not available in the
23source tree).
24
25"shebang lines" (the first line of many unix scripts, like `#!/bin/sh`)
26aren't as useful as you might think in Chromium, because
27most of our python invocations come from other tools like Ninja or
28the swarming infrastructure, and they also don't work on Windows.
29So, don't expect them to help you.
30
31However, if your script is executable, you should still use one, and for
David Munro9980b2c2022-02-02 15:30:4132Python you should use `#!/usr/bin/env python3` or `#!/usr/bin/env vpython3`
Dirk Prankecc232342021-05-13 22:20:1233in order to pick up the right version of Python from your $PATH rather than
34assuming you want the version in `/usr/bin`; this allows you to pick up the
35versions we endorse from
36`depot_tools`.
37
Andrew Grieve32bc5e0d2020-01-03 19:39:5238Chromium follows [PEP-8](https://www.python.org/dev/peps/pep-0008/).
Peter Wendcdb2ec2018-11-26 23:00:3639
Andrew Grieve32bc5e0d2020-01-03 19:39:5240It is also encouraged to follow advice from
41[Google's Python Style Guide](https://google.github.io/styleguide/pyguide.html),
42which is a superset of PEP-8.
43
44See also:
45* [Chromium OS Python Style Guide](https://sites.google.com/a/chromium.org/dev/chromium-os/python-style-guidelines)
46* [Blink Python Style Guide](blink-python.md)
47
48[TOC]
49
50## Our Previous Python Style
51
52Chromium used to differ from PEP-8 in the following ways:
53* Use two-space indentation instead of four-space indentation.
54* Use `CamelCase()` method and function names instead of `unix_hacker_style()`
55 names.
56* 80 character line limits rather than 79.
57
58New scripts should not follow these deviations, but they should be followed when
59making changes to files that follow them.
60
61## Making Style Guide Changes
Peter Wendcdb2ec2018-11-26 23:00:3662
63You can propose changes to this style guide by sending an email to
64`[email protected]`. Ideally, the list will arrive at some consensus and you
65can request review for a change to this file. If there's no consensus,
John Palmerbe051302021-05-19 11:48:3566[`//styleguide/python/OWNERS`](https://chromium.googlesource.com/chromium/src/+/main/styleguide/python/OWNERS)
Peter Wendcdb2ec2018-11-26 23:00:3667get to decide.
68
Peter Wendcdb2ec2018-11-26 23:00:3669## Tools
70
Andrew Grievea6dad4a2018-11-29 13:57:3271### pylint
Peter Wendcdb2ec2018-11-26 23:00:3672[Depot tools](http://commondatastorage.googleapis.com/chrome-infra-docs/flat/depot_tools/docs/html/depot_tools.html)
73contains a local copy of pylint, appropriately configured.
Dirk Prankecc232342021-05-13 22:20:1274* Directories need to opt into pylint presubmit checks via:
Andrew Grievea6dad4a2018-11-29 13:57:3275 `input_api.canned_checks.RunPylint()`.
76
77### YAPF
agrieve1a1b9066b2018-11-30 15:47:2278[YAPF](https://github.com/google/yapf) is the Python formatter used by:
Andrew Grievea6dad4a2018-11-29 13:57:3279
80```sh
81git cl format --python
82```
83
agrieve1a1b9066b2018-11-30 15:47:2284Directories can opt into enforcing auto-formatting by adding a `.style.yapf`
85file with the following contents:
Andrew Grievea6dad4a2018-11-29 13:57:3286```
87[style]
Andrew Grieve83d4c6a92020-01-07 16:50:2388based_on_style = pep8
Andrew Grievea6dad4a2018-11-29 13:57:3289```
90
91Entire files can be formatted (rather than just touched lines) via:
92```sh
93git cl format --python --full
agrieve1a1b9066b2018-11-30 15:47:2294```
95
Andrew Grieve32bc5e0d2020-01-03 19:39:5296YAPF has gotchas. You should review its changes before submitting. Notably:
97 * It does not re-wrap comments.
98 * It won't insert characters in order wrap lines. You might need to add ()s
99 yourself in order to have to wrap long lines for you.
100 * It formats lists differently depending on whether or not they end with a
101 trailing comma.
102
103
agrieve1a1b9066b2018-11-30 15:47:22104#### Bugs
105* Are tracked here: https://github.com/google/yapf/issues.
106* For Chromium-specific bugs, please discuss on `[email protected]`.
107
108#### Editor Integration
Dirk Prankecc232342021-05-13 22:20:12109See: https://github.com/google/yapf/tree/main/plugins
110
111[vpython]: https://chromium.googlesource.com/infra/infra/+/refs/heads/main/doc/users/vpython.md