Build a Pre-commit Workflow to Check and Fix Your Python Code Automatically | by Lynn Kwong | Apr, 2022

Picture by Vishal Jadhav from Unsplash.

Git can run customized scripts, that are the so-called hooks, routinely when sure actions happen.

For instance, the pre-commit, commit-msg, and pre-push hooks are triggered when a commit is made, when a commit message is saved, and earlier than a commit is pushed to the distant repository, respectively.

Amongst these Git hooks, an important one is pre-commit which might carry out static code checking and repair trivial and time-consuming points routinely. Because of pre-commit, the code reviewers can save a variety of time in code assessment and focus extra effectively on the vital logic modifications of the code.

As demonstrated in this post, we will write a pre-commit script, which is only a common executable script, from scratch. Nevertheless, there might be a difficulty when the identical hook is utilized in a number of repositories. We would wish to duplicate and keep the identical piece of code somewhere else, which isn’t very handy.

Fortunately, many of the greatest industry-standard linters corresponding to black, isort, and pylint present some Git hooks that can be utilized straight, with customizable arguments. These Git hooks may be put in with a particular Python library referred to as pre-commit. Sure, it’s the identical identify because the pre-commit Git hook! It’s a framework for managing and sustaining multi-language pre-commit hooks.

On this publish, we are going to introduce essentially the most generally used pre-commit hooks installable with the pre-commit bundle supervisor. The workflow we’re going to construct can carry out the most typical static code checks for Python code. It will possibly enhance your code high quality dramatically and make code assessment a lot simpler on your staff.

Because the pre-commit bundle supervisor is a Python library, we will set up it with pip. You’ll be able to set up it in your system’s library or in a virtual environment, relying by yourself use case.

$ pip set up pre-commit

Now the pre-commit command needs to be out there and we will begin to create the configuration file for it.

$ pre-commit --version
pre-commit 2.18.1

The configurations for the pre-commit bundle supervisor are saved in a file named .pre-commit-config.yaml. You’ll be able to create it and open it in vim or your favourite editor corresponding to VS Code.

Let’s first add some mostly used hooks out there within the pre-commit-hooks repository.

repos is the top-level key for .pre-commit-config.yaml and defines a listing of repository mappings. Each repo is a GitHub repository the place some Git hooks are outlined. In case you open the corresponding repository, you will see a file referred to as .pre-commit-hooks.yaml which defines the hooks out there. The hooks are recognized by ids and embrace different metadata as nicely corresponding to identify, description, sorts, arguments, and many others.

On this instance, some mostly used hooks from the pre-commit-hooks repository are demonstrated. The ids of them are fairly self-explanatory of their capabilities. If you wish to be taught extra about every hook, you may verify them in .pre-commit-hooks.yaml within the repository.

Particularly, the arguments for the hooks may be specified with the args key. On this instance, it’s specified that committing on to the develop and essential branches will not be allowed.

autoflake removes unused imports and variables from Python code. It appears trivial however it’s actually helpful in observe as you could unintentionally go away some unused variables and imports in your code, which might turn out to be messy over time.

The arguments are easy. It’s specified that unused variables and imports might be eliminated in place. You’ll find extra arguments for autoflake on its GitHub page.

Flake8 is a wrapper round PyFlakes, pycodestyle, Ned Batchelder’s McCabe script. It’s a useful gizmo for checking your Python code towards PEP8 coding type and customary programming errors. You’ll be able to set up it as an extension in VS Code and configure it as demonstrated in this post. Nevertheless, with a pre-commit hook for flake8, your code may be routinely checked earlier than it’s dedicated.

In line with PEP8, the max line size and max doc size are specified to be 79 and 72, respectively. Moreover, errors E203 and W503 are ignored which suggests “Whitespace earlier than ‘:’ ” and “Line break occurred earlier than a binary operator”, respectively. You’ll encounter these errors once you use black for formatting as might be launched quickly.

black is a good software that can be utilized to format your Python code routinely. The Python code might be formatted in accordance with PEP8 routinely and prevent a considerable amount of time.

In case you have extra complicated settings for black, you add them in pyproject.toml as demonstrated in this link.

isort is a Python library to type imports alphabetically and get them routinely separated into sections and by kind. isort can set up your messy imports and organize them in accordance with PEP8. Moreover, you’ll have a constant type in your staff and everyone may be completely happy. Please verify this post for a extra detailed introduction to isort if wanted.

The road size is specified to be 79 to make it in step with different linters as demonstrated above. Moreover, importantly, you should specify the src choice and add the trail to your supply code.

In any other case, your native libraries can’t be ordered appropriately. Additionally, it needs to be famous that the choice is src_paths in .isort.cfg and pyproject.toml. Examine this link if that you must have extra management over isort.

Pylint is an computerized Python code evaluation software that may detect programming errors and gives recommendations for code modifications in accordance with PEP8. It’s a useful gizmo that may enhance the standard of your Python code dramatically.

Pylint is kind of strict by default, which is sweet normally however may be overkill generally, particularly for legacy code. Usually you don’t need to introduce an excessive amount of refactoring to your legacy code. On this case, you may disable the warnings that will trigger main refactoring.

For instance, many capabilities or strategies would require some frequent arguments even when they aren’t used, particularly for some API frameworks like Falcon. We are able to specify the choice --disable=unused-argument to disable this sort of warning. You’ll find the error code within the output of pylint. For an exhaustive checklist, please verify this link.

Mypy is a linter that performs static kind checking for Python code. Please verify this post in case you are new to Python-type annotation. It needs to be famous that mypy solely checks the code that has kind annotations added explicitly, and gained’t verify people who don’t have typing added.

By default, mypy doesn’t help the typing for third-party libraries and also you would wish so as to add them to additional_dependencies. Moreover, a standard argument is --ignore-missing-imports, which is helpful when some libraries don’t have kind stubs out there.

pydocstyle is a linter for checking Python docstrings in accordance with PEP 257. It’s a good software to make your docstrings look nicer and have some requirements in your staff. For instance, it requires the primary line of the docstring to be a abstract line and should begin with an crucial verb and finish with a dot.

The default settings ought to suffice normally.

After the hooks are added in .pre-commit-config.yaml, that you must set up them to make them efficient. You’ll be able to run the next command to put in the pre-commit hooks:

$ pre-commit set up

When the command is run, a script named pre-commit might be created in folder .git/hooks. It will likely be run routinely everytime you make a brand new commit.

On this publish, now we have launched a set of pre-commit hooks together with black, isort, mypy, pylint, and many others which might routinely verify and repair your Python code to make it error-free and extra skilled.

The entire file of .pre-commit-config.yaml is as follows. You’ll be able to both use it straight or fine-tune it to make it go well with the requirement of your staff.

More Posts