My Python Programming Workflow
Note: This is a live document with pointers, not a blog post
How do I do python programming.
Basic Setup
Setup asdf to manage multiple python, node and golang versions
Install python versions using asdf:
asdf install python 3.9.21
asdf install python 3.10.16
asdf install python 3.11.11
Install pipx using system package manager like pacman, apt, brew. It creates separate virtualenvs for each python cli tool you install.
Tell pipx to use one of the python version installed by asdf by adding following to .bashrc
or .zshrc
:
PIPX_DEFAULT_PYTHON=/home/user/.asdf/installs/python/3.11.11/bin/python
Use pipx to manage python cli software
- cookiecutter
- pgcli
- poetry
- pre-commit
Project Setup
Activate correct python version using asdf asdf local python 3.11.4
.
This creates a .tool-versions
file in local directory so in-future it automatically picks correct version. This file can be committed to git as well.
Create and use virtualenv using built-in venv package via bash aliases
alias cv='python -m venv .venv'
alias cv='python -m venv .venv'
Poetry can also be used to create and activate virtualenv automatically using poetry run
commands. Configure poetry with:
poetry config virtualenvs.create true
poetry config virtualenvs.in-project true
Why not using mkvirtualenvwrapper?
Use Poetry to install and manage dependencies.
For linting:
- black
- isort
- mypy
flake8Ruff(install separately)
For documentation and versioning:
- mkdocs
- bump2version
For testing:
- pytest with mock, cov extensions
- faker
- ipdb
- tox if multiple python env and package versions are required
Keep most configs for these packages in pyproject.toml
. If not, use setup.cfg. Avoid tool specific config file.
Use Makefile with frequently used commands.
Editor Setup
Use Vim or Vim Mode in Pycharm
Have plugins like EditorConfig
root = true
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
[*.{py,rst,ini}]
indent_style = space
indent_size = 4
[*.{html,css,scss,json,yml}]
line_length=120
indent_style = space
indent_size = 2
[*.md]
trim_trailing_whitespace = false
[Makefile]
indent_style = tab
For pycharm, setup configurations to run tests and tool being developed.
Major packages I find awesome
- Django
- Django Rest Framework
- FastAPI and Starlette
- SQLAlchemy
- Encode databases and httpx
- Celery
- dotenv
- click
- loguru(structlog is equally awesome)
- django-mptt
- open telemetry
- psycopg2
- uwsgi or gunicorn
While Programming
Use extensive logging with packages like loguru. Enable debug logging locally for external calls like File IO, db or network requests. Try using structured logging(json?) to attach extra context to logs
CI
Use GitHub actions or Gitlab CI for testing, building and releasing.