Trezor Core coding style
Python coding style
Run make pystyle
from repository root to perform all style checks and auto-format
where possible.
General style notes
See rules for exceptions in the Exceptions documentation.
Type annotations
We prefer Python 3.10 style annotations:
- instead of
List[int]
, uselist[int]
, dtto forTuple
,Dict
andSet
- instead of
Optional[int]
, useint | None
- instead of
Union[int, str]
, useint | str
This also applies inside if TYPE_CHECKING
branches.
Type-checking imports
At run-time, the typing
module is not available. There is compile-time magic that
removes all from typing
imports and contents of if TYPE_CHECKING
branches.
It is important to put typing-only imports into if TYPE_CHECKING
, to make sure that
these modules are not needlessly pulled in at run-time.
Due to the compile-time magic, it is always possible to put a from typing
import
at top level. The style for doing that are as follows:
- If the module needs to import other modules, create type aliases, TypeVars or
Protocols, the only top-level import should be
TYPE_CHECKING
. Everything else (including other items fromtyping
module) should be imported in theTYPE_CHECKING
branch:from typing import TYPE_CHECKING if TYPE_CHECKING: from typing import Any, TypeVar, Union from trezor.messages import SomeMessage TypeAlias = Union[int, str] T = TypeVar("T")
- If the module only needs items from
typing
, you should not create aTYPE_CHECKING
branch, and instead import all required items on top level:from typing import Any, Iterator, Sequence
Tools
Configurations of specific Python style tools (isort
, flake8
, pylint
) can be found
in root setup.cfg
.
Formatting
We are auto-formatting code with black
and use the black
code
style.
We use isort
to organize imports.
Linting
We use flake8
lints, disabling only those that conflict with black
code style.
We use a select subset of pylint
checks that are hard-enforced.
Type checking
We use pyright
for type-checking. The codebase is fully type-checked, except for
the Monero app (as of 2022-01).
C coding style
Formatting is done by clang-format
. We are using the Google code
style.
Run make cstyle
from repository root to auto-format.
Rust coding style
Formatting is done by rustfmt
. We are using the Rust
style.
Run make ruststyle
from repository root to auto-format.