Kontroly a formátování kódu

Programování v GIS 2

Jan Caha

2025-04-07

Kontroly kódu

  • kontrola syntaxe, dobré praxe, formátování
  • kontrola kvality kódu
  • kontrola typů
  • a další
  • balíčky a extenze pro VSCode ale i pro PyCharm

Chyby kontrol kódu

  • nejedná se o chyby, které by vyvolaly chybu při běhu programu/skriptu
  • ale o chyby, které by mohly vést k chybám
  • např. špatné pojmenování proměnné, nevyužité proměnné, špatné formátování kódu
  • špatné typy proměnných
  • špatné použití funkcí
  • je vhodné se těmto chybám vyhnout a předcházet jim
  • ve VS Code se tyto chyby zobrazují jako podtžení kódu (v různých barvách, dle vážnosti a typu chyby)

MyPy

  • kontrola typů proměnných u veškerého typovaného kódu
  • někdy je nutné explicitně přetypovat proměnné, což lze udělat pomocí funkce typing.cast()
import typing

# přetypování proměnné
promenna = typing.cast(NovaTrida, promenna)

# za tímto kódem už je promměnná typu NovaTrida
if isinstance(promenna, NovaTrida):
    ...

# za tímto kódem už je promměnná typu NovaTrida
assert isinstance(promenna, NovaTrida)

pep8

  • kontroly stylu kódu proti PEP 8
  • neprovádí logickou kontrolu kódu
  • mezery v kódu, délka řádků, pojmenování proměnných, atd.

flake8

  • kontrola stylu kódu i možných chyb
  • kontrola přehnané komplexity kódu

pylint

  • kontrola stylu kódu i možných chyb
  • vynucuje kódovací standardy, hledá i příklady špatné praxe
  • nejkomplexnější kontrola kódu, s detailním hodnocením a reporty

Formátování kódu

  • úprava kódu do standardizovaného formátu
  • úprava importů

black a isort

  • extenze pro VS Code
  • existují situace, kdy je formátování kódu v konfliktu s kontrolami kódu
  • fungují automaticky, jen vhodná kontrola nastavení ve VS Code
  • parametry pro black a isort lze nastavit v pyproject.toml

Konfigurace

  • lze buď v nastavení VS Code
  • nebo v souboru pyproject.toml, který je v kořenovém adresáři projektu, kde nástroje nastavení načtou

Konfigurace v VS Code v settings.json

"flake8.args": [
    "--max-line-length",
    "160"
],
"pylint.args": [
    "--disable=E0611",
    "--max-line-length=160"
],
"isort.args": [
    "--profile",
    "black",
    "--line-width",
    "120"
],
"black-formatter.args": [
    "--line-length",
    "120"
]

Konfigurace v pyproject.toml

[tool.flake8]
exclude = [".git", "__pycache__", "tests/*"]
max-line-length = 120
ignore = "W293,W504"

[tool.pylint.format]
max-line-length = 120

[tool.pylint.messages_control]
disable = [
    "redefined-outer-name",
    "no-name-in-module",
    "missing-function-docstring",
    "missing-module-docstring",
    "missing-class-docstring",
    "invalid-name",
    "too-many-arguments",
    "attribute-defined-outside-init",
]

[tool.mypy]
follow_imports = "silent"
ignore_missing_imports = true
show_column_numbers = true
no_pretty = true
no_strict_optional = true

[tool.black]
line-length = 120

[tool.isort]
profile = "black"
line_length = 120
skip_gitignore = true

Dotazy?