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,DictandSet - 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 fromtypingmodule) should be imported in theTYPE_CHECKINGbranch: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_CHECKINGbranch, 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.