Python will be our primary programming language. Thus we assume the readers have a good understanding of the Python language in this section. We will cover the following topics.
- Environment management;
- Dependency management;
Python is notorious in environment management. The simple and out-of-the-box solution is
conda for environment management.
The most useful commands for conda are the following.
- Create an environment:
conda create -n my-env-name python=3.9 pip, where
my-env-nameis the name of the environment,
python=3.9specifies the version of Python,
pipin this new environment.
- Activate an environment:
conda activate my-env-name
- List all available environments:
conda env list
Anaconda provides a nice cheatsheet.
pyenv is a good alternative to
pyenv is also a good tool for managing different versions and environments of python. However,
pyenv only provides python version management. It is to be combined with
venv to create local python environments.
We have a few choices to specify the dependencies. The most used method at the moment is
requirements.txt + pip.
environment.yml is an alternative to
conda provides its own requirement specification using
environment.yaml. However, this method doesn't make things better. If we ever need to make it more complicated than
pyproject.toml is the way to go.
Modern Python with
pyenv have trouble solving the actual full dependency graphs of all the packages used, sometimes. This problem is solved by
poetry. However, this also means
poetry can be very slow as it has to load many different versions of the packages to try out 5.
While tutorials on how to use
poetry are not within the scope of this book, we highly recommend using
poetry in a formal project.
Python Styles and
In a Python project, it is important to have certain conventions or styles. To be consistent, one could follow some style guides for python. There are official proposals, such as PEP8, and "third party" style guides, such as Google Python Style Guide 34.
We also recommend
pre-commit helps us manage git hooks to be executed before each commit. Once installed, every time we run
git commit -m "my commit message here", a series of commands will be executed first based on the configurations.
We also recommend the following hooks,
black, which formats the code based on pre-defined styles,
isort, which orders the Python imports1,
mypy, which is a linter for Python.
The following is an example
.pre-commit-config.yaml file for a Python project.
repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.2.0 hooks: - id: check-added-large-files - id: debug-statements - id: detect-private-key - id: end-of-file-fixer - id: requirements-txt-fixer - id: trailing-whitespace - repo: https://github.com/pre-commit/mirrors-mypy rev: v0.960 hooks: - id: mypy args: - "--no-strict-optional" - "--ignore-missing-imports" - repo: https://github.com/ambv/black rev: 22.6.0 hooks: - id: black language: python args: - "--line-length=120" - repo: https://github.com/pycqa/isort rev: 5.10.1 hooks: - id: isort name: isort (python) args: ["--profile", "black"]
Writing docstrings for functions and classes can help our future self understand them more easily. There are different styles for docstrings. Two of the popular ones are
Test Saves Time¶
Adding tests to our code can save us time. We will not list all these benefits of having tests. But tests can help us debug our code and ship results more confidently. For example, suppose we are developing a function and spot a bug. One of the best ways of debugging it is to write a test and put a debugger breakpoint at the suspicious line of the code. With the help of IDEs such as Visual Studio Code, this process can save us a lot of time in debugging.
Pre Commit. In: isort [Internet]. [cited 22 Jul 2022]. Available: https://pycqa.github.io/isort/docs/configuration/pre-commit.html ↩
pre-commit-config-pre-commit-hooks.yaml. In: Gist [Internet]. [cited 22 Jul 2022]. Available: https://gist.github.com/lynnkwong/f7591525cfc903ec592943e0f2a61ed9 ↩
Poetry is extremely slow when resolving the dependencies · Issue #2094 · python-poetry/poetry. In: GitHub [Internet]. [cited 23 Jul 2022]. Available: https://github.com/python-poetry/poetry/issues/2094 ↩