# Python Coding style

## Coding style

{ref}`black` is the tool used to reformat the Python code.

## Linting

The Python linting is done by {ref}`ruff` which includes rules from `flake8` and `pylint`.
It is executed by mozlint both at review phase and in the CI.

## Indentation

Four spaces in Python code.

### Makefile/moz.build practices

- Changes to makefile and moz.build variables do not require
  build-config peer review. Any other build system changes, such as
  adding new scripts or rules, require review from the build-config
  team.

- Suffix long `if`/`endif` conditionals with #{ & #}, so editors
  can display matched tokens enclosing a block of statements.

  ```
  ifdef CHECK_TYPE #{
    ifneq ($(flavor var_type),recursive) #{
      $(warning var should be expandable but detected var_type=$(flavor var_type))
    endif #}
  endif #}
  ```

- moz.build are python and follow normal Python style.

- List assignments should be written with one element per line. Align
  closing square brace with start of variable assignment. If ordering
  is not important, variables should be in alphabetical order.

  ```python
  var += [
      'foo',
      'bar'
  ]
  ```

- Use `CONFIG['TARGET_CPU'] {=arm}` to test for generic classes of
  architecture rather than `CONFIG['OS_TEST'] {=armv7}` (re: bug 886689).

## Other advice

- Install the
  [mozext](https://hg.mozilla.org/hgcustom/version-control-tools/file/default/hgext/mozext)
  Mercurial extension, and address every issue reported on commit
  or the output of `hg critic`.
- Follow [PEP 8](https://www.python.org/dev/peps/pep-0008/). Please run {ref}`black` for this.
- Do not place statements on the same line as `if/elif/else`
  conditionals to form a one-liner.
- Global vars, please avoid them at all cost.
- Exclude outer parenthesis from conditionals.Use
  `if x > 5:,`rather than `if (x > 5):`
- Use string formatters, rather than var + str(val).
  `var = 'Type %s value is %d'% ('int', 5).`
- Testing/Unit tests, please write them and make sure that they are executed in the CI.
