blob: 4139eedc4a68505414c6f37ad8cfa872d71c442c [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
David Sandersa9544a22022-03-12 00:59:088[//docs/python3_migration.md](../../docs/python3_migration.md) for more on
Dirk Prankecc232342021-05-13 22:20:129how 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
Bruce Dawson942f9bcd2022-08-10 18:40:2217run under vpython, so it is safe there, and vpython is the default for
18running scripts during PRESUBMIT checks (input_api.python3_executable points to
19vpython3 and is used in GetPythonUnitTests), but you should not use vpython
20during gclient runhooks, or during the build unless a
21[//build/OWNER](../../build/OWNERS) has told you that it is okay to do so.
Dirk Prankecc232342021-05-13 22:20:1222
23Also, there is some performance overhead to using vpython, so prefer not
24to use vpython unless you need it (to pick up packages not available in the
25source tree).
26
27"shebang lines" (the first line of many unix scripts, like `#!/bin/sh`)
28aren't as useful as you might think in Chromium, because
29most of our python invocations come from other tools like Ninja or
30the swarming infrastructure, and they also don't work on Windows.
Bruce Dawson942f9bcd2022-08-10 18:40:2231So, don't expect them to help you. That said, a python 3 shebang is one way to
32indicate to the presubmit system that test scripts should be run under Python 3
33rather than Python 2.
Dirk Prankecc232342021-05-13 22:20:1234
35However, if your script is executable, you should still use one, and for
David Munro9980b2c2022-02-02 15:30:4136Python you should use `#!/usr/bin/env python3` or `#!/usr/bin/env vpython3`
Dirk Prankecc232342021-05-13 22:20:1237in order to pick up the right version of Python from your $PATH rather than
38assuming you want the version in `/usr/bin`; this allows you to pick up the
39versions we endorse from
40`depot_tools`.
41
Andrew Grieve32bc5e0d2020-01-03 19:39:5242Chromium follows [PEP-8](https://www.python.org/dev/peps/pep-0008/).
Peter Wendcdb2ec2018-11-26 23:00:3643
Andrew Grieve32bc5e0d2020-01-03 19:39:5244It is also encouraged to follow advice from
45[Google's Python Style Guide](https://google.github.io/styleguide/pyguide.html),
46which is a superset of PEP-8.
47
48See also:
Brian Norris13e1fe422023-08-25 20:26:1149* [ChromiumOS Python Style Guide](https://chromium.googlesource.com/chromiumos/docs/+/HEAD/styleguide/python.md)
Andrew Grieve32bc5e0d2020-01-03 19:39:5250* [Blink Python Style Guide](blink-python.md)
51
52[TOC]
53
54## Our Previous Python Style
55
56Chromium used to differ from PEP-8 in the following ways:
57* Use two-space indentation instead of four-space indentation.
58* Use `CamelCase()` method and function names instead of `unix_hacker_style()`
59 names.
60* 80 character line limits rather than 79.
61
62New scripts should not follow these deviations, but they should be followed when
63making changes to files that follow them.
64
65## Making Style Guide Changes
Peter Wendcdb2ec2018-11-26 23:00:3666
67You can propose changes to this style guide by sending an email to
68`[email protected]`. Ideally, the list will arrive at some consensus and you
69can request review for a change to this file. If there's no consensus,
John Palmerbe051302021-05-19 11:48:3570[`//styleguide/python/OWNERS`](https://chromium.googlesource.com/chromium/src/+/main/styleguide/python/OWNERS)
Peter Wendcdb2ec2018-11-26 23:00:3671get to decide.
72
Bruce Dawson942f9bcd2022-08-10 18:40:2273## Portability
74
75There are a couple of differences in how text files are handled on Windows that
76can lead to portability problems. These differences are:
77
78* The default encoding when reading/writing text files is cp1252 on Windows and
79utf-8 on Linux, which can lead to Windows-only test failures. These can be
80avoided by always specifying `encoding='utf-8'` when opening text files.
81
82* The default behavior when writing text files on Windows is to emit \r\n
83(carriage return line feed) line endings. This can lead to cryptic Windows-only
84test failures and is generally undesirable. This can be avoided by always
85specifying `newline=''` when opening text files for writing.
86
87That is, use these forms when opening text files in Python:
88
89* reading: with open(filename, 'r', encoding='utf-8') as f:
90* writing: with open(filename, 'w', encoding='utf-8', newline='') as f:
91
Peter Wendcdb2ec2018-11-26 23:00:3692## Tools
93
Andrew Grievea6dad4a2018-11-29 13:57:3294### pylint
Peter Wendcdb2ec2018-11-26 23:00:3695[Depot tools](http://commondatastorage.googleapis.com/chrome-infra-docs/flat/depot_tools/docs/html/depot_tools.html)
96contains a local copy of pylint, appropriately configured.
Dirk Prankecc232342021-05-13 22:20:1297* Directories need to opt into pylint presubmit checks via:
Andrew Grievea6dad4a2018-11-29 13:57:3298 `input_api.canned_checks.RunPylint()`.
99
100### YAPF
agrieve1a1b9066b2018-11-30 15:47:22101[YAPF](https://github.com/google/yapf) is the Python formatter used by:
Andrew Grievea6dad4a2018-11-29 13:57:32102
103```sh
104git cl format --python
105```
106
agrieve1a1b9066b2018-11-30 15:47:22107Directories can opt into enforcing auto-formatting by adding a `.style.yapf`
108file with the following contents:
Andrew Grievea6dad4a2018-11-29 13:57:32109```
110[style]
Andrew Grieve83d4c6a92020-01-07 16:50:23111based_on_style = pep8
Andrew Grievea6dad4a2018-11-29 13:57:32112```
113
114Entire files can be formatted (rather than just touched lines) via:
115```sh
116git cl format --python --full
agrieve1a1b9066b2018-11-30 15:47:22117```
118
Andrew Grieve32bc5e0d2020-01-03 19:39:52119YAPF has gotchas. You should review its changes before submitting. Notably:
120 * It does not re-wrap comments.
121 * It won't insert characters in order wrap lines. You might need to add ()s
122 yourself in order to have to wrap long lines for you.
123 * It formats lists differently depending on whether or not they end with a
124 trailing comma.
125
126
agrieve1a1b9066b2018-11-30 15:47:22127#### Bugs
128* Are tracked here: https://github.com/google/yapf/issues.
129* For Chromium-specific bugs, please discuss on `[email protected]`.
130
131#### Editor Integration
Dirk Prankecc232342021-05-13 22:20:12132See: https://github.com/google/yapf/tree/main/plugins
133
134[vpython]: https://chromium.googlesource.com/infra/infra/+/refs/heads/main/doc/users/vpython.md