Post

Como gosto de codar em Python

Um guia de ferramentas que sempre uso em meus projetos pessoais Python para organizar o código e mais alguns truques.

Com o tempo aprendi a gostar de organizar meus códigos Python desde o início do projeto, seguindo a maneira que eu gosto de programar e também a PEP8. Grande parte dessas ferramentas conheci graças ao @dunossauro, e também algumas boas práticas.

Resolvi centralizar tudo aqui, assim sempre que eu iniciar um novo projeto posso pegar tudo aqui novamente hehe 😄.

Se você também gostar dessas dicas, me sentirei honrado em poder te ajudar. E se conhecer alguma outra maneira de organizar códigos, ficarei muito grato se compartilhar comigo!

Ferramentas de desenvolvimento

  • Pytest, para testar meus projetos;
  • Coverage, para saber se esqueci de testar algo;
  • Taskipy, para encurtar grandes comandos;
  • Blue, para seguir a PEP8 e formatar o código;
  • Ruff, um poderoso linter para Python;
  • Isort, para organizar meus imports.
1
poetry add --group dev taskipy blue ruff isort pytest pytest-cov
1
pipenv install --dev taskipy blue ruff isort pytest pytest-cov
1
pip install taskipy blue ruff isort pytest pytest-cov

Ferramentas de documentação

1
poetry add --group doc mkdocs-material mkdocstrings mkdocstrings-python
1
pip install mkdocs-material mkdocstrings mkdocstrings-python

Configurações

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[tool.ruff]
line-length = 79

[tool.isort]
profile = "black"
line_length = 79

[tool.taskipy.tasks]
lint = "ruff check . && blue --check -S . --diff && isort --check --diff ."
format = "blue -S .  && isort ."
doc = "mkdocs serve"
pre_test = "task lint"
test = "pytest -s -x --cov=<YOUR-PROJECT> -vv"
post_test = "coverage run -m pytest && coverage html"

[tool.coverage.run]
branch = true
omit = ["**/*test*.py"]

[tool.pytest.ini_options]
pythonpath = "."
addopts = "--doctest-modules"
python_files = "test.py tests.py test_*.py tests_*.py *_test.py *_tests.py"

requirements.txt

Mesmo que eu use poetry em um projeto, gosto de criar um arquivo de requirements.txt para duas coisas:

  • Informar ao PyCharm quais são as dependências do meu projeto;
  • E durante o fluxo do Github Actions para instalar as dependências com pip.

Para criar o arquivo:

1
pip freeze > requirements.txt

Ou:

1
poetry export --with dev --without-hashes --without-urls --output requirements.txt

Padrões de código

Para docstrings sempre uso o padrão do Google Docstrings. Me parece muito mais consiso o bonito.

Integração Contínua com GitHub Actions

Sempre configuro pipelines para meus projetos, assim caso eu esqueça de verificar algo antes de efetuar o push, o fluxo de trabalho do GitHub Actions realiza todas as verificações incluindo linters e testes, e envia uma notificação direto para meu celular informando se está tudo ok.

Trabalhos incluídos no ci.yml

  • Ruff, linter para checar se estou seguindo a PEP8;
  • Isort, verifica se meus imports estão ordenados;
  • Testes, executa todos os testes com Pytest e envia o relatório de cobertura para o Codecov.

AVISO

Substitua o trecho <NAME-OF-YOUR-PYTHON-PACKAGE> pelo nome do seu pacote!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
on: [ push, pull_request ]

name: CI

jobs:
  ruff:
    name: Ruff
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: chartboost/ruff-action@v1
        with:
          version: "0.1.3"

  isort:
    name: Isort
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: isort/isort-action@v1
        with:
          configuration: "--profile black -l 79"
  
  tests:
    name: Tests
    runs-on: ubuntu-latest
    strategy:
      max-parallel: 4
      matrix:
        python-version: [ 3.11 ]
    steps:
      - uses: actions/checkout@v3
      - name: Set up Python $
        uses: actions/setup-python@v3
        with:
          python-version: $
      - name: Install Dependencies
        run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt
      - name: Run Tests
        run: pytest -s -x --cov=<NAME-OF-YOUR-PYTHON-PACKAGE> -vv
      - name: Upload coverage reports to Codecov
        uses: codecov/codecov-action@v3
        env:
          CODECOV_TOKEN: $

Mensagens de commit

Priorizo o uso de mensagens semânticas para os commits. Sempre procuro referências neste repositório de Iuri Silva.

Por que não descontrair um pouco?

Sempre desenvolvemos projetos que são úteis para resolver alguns problemas, mas pode ser que este projeto não seja muito sério, ou que tenha sido feito apenas por diversão. Nesse caso, gosto de licenciar meu projeto sob a licença BEER-WARE, haha.

Isso significa que você pode fazer o que quiser com o meu código. Se nos encontrarmos algum dia, e você achar que vale a pena, você pode me pagar uma cerveja 😁.

1
2
3
4
5
6
7
8
9
/*
* ---------------------------------------------------------------------------------
* "THE BEER-WARE LICENSE":
* <[email protected]> wrote this file. If you are reading this license,
* as long as you keep this note, you can do whatever you want with this code.
* If we meet someday, and you think it's worth it, you can buy me a beer.
* Henrique Sebastião
* ---------------------------------------------------------------------------------
*/
1
2
3
4
5
6
7
8
9
/*
* --------------------------------------------------------------------------------------------
* "THE BEER-WARE LICENSE":
* <[email protected]> escreveu este arquivo. Se voce estiver lendo essa licensa,
* contanto que mantenha esta nota, voce poderá fazer o que quiser com este código.
* Se nos encontrarmos algum dia, e você achar que vale a pena, você pode me pagar uma cerveja.
* Henrique Sebastião
* --------------------------------------------------------------------------------------------
*/
Esta postagem está licenciada sob CC BY 4.0 pelo autor.