Debugování v Pythonu: breakpoint(), pdb a debugger ve VS Code
Jak hledat chyby v Pythonu – čtení tracebacku, breakpoint() a příkazy pdb, post-mortem ladění, podmíněné breakpointy a debugger ve VS Code.
Hromada print() volání je nejčastější způsob ladění a zároveň ten nejpomalejší. Python má vestavěný debugger, který program zastaví na libovolném místě a nechá vás prozkoumat proměnné, zavolat funkce a krokovat řádek po řádku. Tady je praktický průvodce.
Krok 0: přečtěte traceback zespodu
Traceback (most recent call last):
File "app.py", line 18, in <module>
main()
File "app.py", line 15, in main
celkem = spocitej(objednavky)
File "app.py", line 9, in spocitej
return sum(o["cena"] * o["ks"] for o in objednavky)
File "app.py", line 9, in <genexpr>
return sum(o["cena"] * o["ks"] for o in objednavky)
~^^^^^^^^
KeyError: 'cena'
- Poslední řádek je typ a zpráva výjimky – začněte tady.
- Řádek nad ním ukazuje, kde přesně se to stalo. Od Pythonu 3.11 značky
^^^^označí i konkrétní výraz. - Výše je cesta volání. Hledejte nejnižší řádek, který patří vašemu kódu, ne knihovně.
Tady je jasné: některá objednávka nemá klíč cena. Kterou, zjistí debugger.
breakpoint(): zastavení programu
Od Pythonu 3.7 stačí vložit do kódu:
def spocitej(objednavky):
breakpoint()
return sum(o["cena"] * o["ks"] for o in objednavky)
Po spuštění se program zastaví a otevře se prompt (Pdb).
Nejdůležitější příkazy pdb
| Příkaz | Význam |
|---|---|
l / ll |
výpis okolního kódu / celé funkce |
n |
další řádek (do funkcí nevstupuje) |
s |
vstoupit do volané funkce |
c |
pokračovat do dalšího breakpointu |
r |
doběhnout do konce aktuální funkce |
p výraz / pp výraz |
vypsat hodnotu / hezky formátovaně |
w |
kde jsem (zásobník volání) |
u / d |
posun o úroveň nahoru / dolů v zásobníku |
b 25 |
breakpoint na řádku 25 |
b 25, x > 100 |
podmíněný breakpoint |
display výraz |
vypisuje výraz po každém kroku |
interact |
plná interaktivní konzole s lokálními proměnnými |
q |
ukončit |
V našem příkladu:
(Pdb) pp [o for o in objednavky if "cena" not in o]
[{'id': 7, 'price': 120, 'ks': 1}]
Objednávka č. 7 přišla s anglickým klíčem. Chyba nalezena bez jediného print.
Pozor: jednopísmenné názvy proměnných kolidují s příkazy. Proměnnou n vypíšete jako p n, nebo výraz začněte vykřičníkem: !n.
Post-mortem: ladění až po pádu
Nemusíte vědět předem, kam breakpoint dát. Spusťte skript pod pdb:
python -m pdb -c continue app.py
Program běží normálně, a když spadne na nezachycené výjimce, debugger se otevře přímo v místě chyby se všemi proměnnými.
V interaktivní konzoli nebo Jupyteru po výjimce:
import pdb; pdb.pm()
Uvnitř except bloku:
except Exception:
import pdb; pdb.post_mortem()
Vypnutí breakpointů bez úpravy kódu
PYTHONBREAKPOINT=0 python app.py
Funkce breakpoint() respektuje tuto proměnnou prostředí. Lze jí také nastavit jiný debugger, např. PYTHONBREAKPOINT=ipdb.set_trace (po pip install ipdb, který přidá barvy a doplňování).
Breakpointy do produkce samozřejmě necommitujte. Linter Ruff má pravidlo T100, které je najde.
Debugger ve VS Code
S rozšířením Python (a Python Debugger) od Microsoftu:
- Klikněte vlevo od čísla řádku – objeví se červená tečka.
- Stiskněte F5 a zvolte Python Debugger: Current File.
Pro opakované spouštění s argumenty vytvořte .vscode/launch.json:
{
"version": "0.2.0",
"configurations": [
{
"name": "App s argumenty",
"type": "debugpy",
"request": "launch",
"program": "${workspaceFolder}/app.py",
"args": ["--vstup", "data.csv"],
"console": "integratedTerminal",
"justMyCode": true
},
{
"name": "FastAPI",
"type": "debugpy",
"request": "launch",
"module": "uvicorn",
"args": ["main:app", "--reload"]
}
]
}
Užitečné funkce:
- Podmíněný breakpoint – pravým tlačítkem na tečku → Edit Breakpoint → výraz
o.get("cena") is None. - Logpoint – místo zastavení vypíše zprávu (
Objednávka {o}). Je toprint, který nemusíte mazat. - Debug Console – vyhodnocuje výrazy v kontextu zastaveného programu.
justMyCode: falseumožní krokovat i do knihoven.
Ladění testů
pytest --pdb # debugger při selhání testu
pytest --trace # zastaví na začátku každého testu
pytest -x --pdb -k nazev_testu
Ladění na vzdáleném serveru
Pro proces na serveru se dá použít debugpy:
import debugpy
debugpy.listen(("127.0.0.1", 5678))
debugpy.wait_for_client()
Port nikdy neotevírejte do internetu – připojte se přes SSH tunel (ssh -L 5678:127.0.0.1:5678 server) a ve VS Code použijte konfiguraci "request": "attach". Ještě jednodušší je otevřít celý projekt na serveru přes Remote-SSH a ladit lokálně tam.
Ladicí návyky
- Nejdřív reprodukujte. Chyba, kterou neumíte vyvolat, se opravuje naslepo.
- Zmenšete vstup na nejmenší, který chybu ještě vyvolá.
- Ověřte předpoklady, ne kód, o kterém „víte“, že funguje.
- Po opravě napište test, který by chybu chytil.
A když se zaseknete, vložte traceback i související funkci do ColdHost AI v režimu Řešení problémů. Pro zapeklité chyby s více moduly zvolte model Polaris, který nad problémem přemýšlí důkladněji.