I think I've found the four horsemen of the Apocalypse in the python world. A combo that, while will cause pain and destruction at first, will also leave afterwards a much better codebase, stricter but uniform and less prone to certain bugs.
Who are these raiders?
mypy: Not a newcomer to my life (see I & II). Each day I'm more convinced that any non-trivial python project should embrace type hints as self-documentation and as a safety measure to reduce wrong typing bugs.
flake8: The classic, so useful and almost always customized, losing some of its power when used alone. Still certainly useful, just needs to be configured to adapt to black
.
isort: Automatically formats your imports. By itself supports certain settings, but should also be configured to please black
rules.
black: The warmonger. Opinionated, radical, almost non-configurable, but pep-8 compliant and with decent reasonings about each and every rule it applies when auto-formatting the files. It will probably make you scream in anger when it first modifies all files, even some you didn't knew your project had, even django migrations and settings files 🤣... But it is the ultimate tool to cut out nitpickings and stupid discussions at pull request reviews. Everyone will be able to focus on reviewing the code itself instead of how it looks.
pre-commit: isort
and black
are meant to run with either this tool or a similar one, instead of as a test (black
even ignores stdout process piping). After some experiments, the truth is that makes more sense to keep auto-formatters at a different level than test runners and linters, and as flake8
will also fail the pre-commit hook, I decided to move everything except mypy
to pre-commit
.
Go programming language has, among other things, taken a great step by making a great decision: It provides one official way to format your code, and it does fix the formatting automatically by itself (instead of emitting warnings/errors).
I was reluctant to try black
and isort
because I was worried of the chaos they can cause. But again, checking code often means coding style discussions here and there, so encouraged by a colleage I decided to try it both at work (in a softer and more gradual way) and at home. Almost everybody will hate at least one or two changes it automatically performs, but it leaves no more room for discussion, as you can only configure the maximum line length. period.
I ran black
through my whole project, but else they only format created and modified files, which is good for big codebases.
It takes some time to configure all of the linters and formatters until you're able to do a few sweeps and finally commit, so here are my configuration values:
- .flake8
- .isort.cfg
- pyproject.toml (
black
's config file) - mypy.ini
Mypy runs as a linter test, but the other three are setup as pre-commit
hooks inside .pre-commit-config.yaml.
Tags: Development