Les erreurs Python se répartissent en trois catégories distinctes - syntaxe, exécution et logique - et l'outil adapté à chacune est différent. Un vérificateur de syntaxe détecte les problèmes structurels avant même que l'interpréteur n'exécute une ligne ; un explicateur de traceback décode la chaîne d'appels après l'apparition d'une exception ; un analyseur statique comme Flake8 ou mypy trouve des bugs invisibles pour l'un comme pour l'autre. Ce guide associe chaque catégorie d'erreur Python au meilleur outil pour la détecter, avec des workflows pour le développement local, l'éditeur et la CI/CD.
Types d'erreurs Python
Chaque erreur Python relève de l'une des trois catégories, et savoir à laquelle vous avez affaire vous indique immédiatement quel outil employer. Les confondre conduit à passer dix minutes à faire tourner un vérificateur de syntaxe sur un problème d'exécution, ou à brancher un vérificateur de types pour résoudre une simple faute d'indentation. Les catégories sont distinctes au niveau de l'interpréteur - chacune se manifeste à un stade différent de l'exécution.
Erreurs de syntaxe et erreurs d'indentation
Python lève un `SyntaxError` ou un `IndentationError` au moment de l'analyse - avant qu'un seul octet de bytecode ne soit généré. L'interpréteur lit le fichier source, construit un arbre syntaxique abstrait et s'arrête immédiatement si la structure viole la grammaire Python. Déclencheurs courants : deux-points manquants après `def`, `class`, `if` ou `for` ; parenthèses ou crochets non fermés ; mélange de tabulations et d'espaces dans un même bloc ; ou utilisation d'un mot réservé comme nom de variable. Le message d'erreur inclut le nom du fichier, le numéro de ligne et un caret pointant le jeton inattendu.
Exceptions à l'exécution
Les exceptions à l'exécution sont levées pendant l'exécution, quand du code syntaxiquement valide tente une opération illégale. Les plus courantes : `TypeError` (appeler quelque chose de non appelable, passer des types d'arguments incorrects), `AttributeError` (accéder à une méthode ou un attribut inexistant sur un objet), `NameError` (référencer une variable jamais affectée), `KeyError` (accéder à une clé de dictionnaire absente) et `IndexError` (référencer une position de liste hors limites). Les détecter exige un environnement en exécution, une stack trace ou une analyse statique minutieuse.
Erreurs de logique
Les erreurs de logique produisent un résultat incorrect sans lever aucune exception. Un décalage d'unité dans une plage, un argument par défaut mutable qui accumule un état entre les appels, une copie superficielle là où une copie profonde était attendue - tout cela est invisible pour tout vérificateur de syntaxe et pour la plupart des analyseurs statiques. On ne les trouve qu'en exécutant le code avec des données de test représentatives, en écrivant des tests unitaires ou en relisant la logique manuellement.
- SyntaxError : Structure défectueuse - deux-points manquant, crochet non fermé, jeton invalide. Détectée au moment de l'analyse.
- IndentationError : Espacement incohérent - tabulations et espaces mélangés, ou bloc indenté à un niveau impossible.
- TypeError : Type incorrect - passer une chaîne là où un nombre est attendu, appeler un entier.
- NameError : Nom non défini - référencer une variable avant affectation ou mal orthographier un nom de fonction.
- AttributeError : Attribut manquant - appeler `.split()` sur un entier, accéder à un attribut supprimé.
- Bug de logique : Résultat incorrect, aucune exception - exige des tests, un débogueur ou une relecture manuelle attentive.
Note
Vérificateurs de syntaxe Python
Un vérificateur de syntaxe Python valide la structure de votre code sans l'exécuter et signale chaque endroit où le source viole la grammaire Python. C'est la première vérification, la plus rapide et la plus sûre - résultats en millisecondes, sans effets de bord et sans dépendre d'un environnement Python fonctionnel configuré localement.
Quand utiliser un vérificateur de syntaxe
Les vérificateurs de syntaxe sont rentables dans quatre situations : quand vous recevez du Python d'un tiers (code généré, extrait de documentation, fichier d'un collaborateur), quand vous écrivez du Python dans un éditeur sans support de language server, quand vous avez besoin d'une vérification rapide sur un script très édité avant un commit, et quand vous déboguez un script qui refuse de démarrer sans aucune sortie utile dans le terminal.
Vérification de syntaxe intégrée avec py_compile
Python embarque un vérificateur de syntaxe qui ne demande aucune installation supplémentaire. Lancez `python -m py_compile yourfile.py` - si la commande se termine en silence, la syntaxe est valide. En cas de problème, elle affiche le nom du fichier, le numéro de ligne et le type d'erreur. Pour vérifier plusieurs fichiers d'un coup, `python -m compileall src/` parcourt un arborescence et signale chaque erreur de syntaxe trouvée.
# Check a single file - exits silently if valid
python -m py_compile myscript.py
# Check all .py files in a directory tree
python -m compileall src/
# Verbose output - shows each file checked
python -m compileall -v src/
# Check without writing .pyc bytecode files
python -m compileall -b src/Vérification de syntaxe dans le navigateur
Le validateur de syntaxe Python d'Aback Tools fonctionne entièrement dans votre navigateur. Collez n'importe quel script Python - quelle qu'en soit la longueur - et obtenez des diagnostics au niveau de la ligne pour les erreurs d'indentation, les jetons non appariés, les chaînes non terminées et les problèmes structurels en moins d'une seconde. Votre code n'est jamais envoyé à un serveur, ce qui le rend sûr pour les scripts propriétaires, les outils internes et le code applicatif confidentiel.
| Vérification | Validateur de syntaxe | Flake8 | Pylint | mypy |
|---|---|---|---|---|
| Deux-points / crochet manquant | ✓ Oui | ✓ Oui | ✓ Oui | ✓ Oui |
| IndentationError | ✓ Oui | ✓ Oui | ✓ Oui | ✓ Oui |
| Variable non définie (NameError) | ✗ Non | ✓ pyflakes | ✓ Oui | ✓ Oui |
| Import inutilisé | ✗ Non | ✓ pyflakes | ✓ Oui | ⚠ Partiel |
| Incompatibilité de type | ✗ Non | ✗ Non | ⚠ Partiel | ✓ Oui |
| Violations de style PEP 8 | ✗ Non | ✓ pycodestyle | ✓ Oui | ✗ Non |
| Logique / résultat incorrect | ✗ Non | ✗ Non | ✗ Non | ✗ Non |
Validateur de syntaxe Python
Vérifiez instantanément vos scripts Python pour les erreurs de syntaxe et d'indentation - local au navigateur, diagnostics ligne par ligne, sans envoi.
Lire les tracebacks Python
Un traceback Python est le journal de l'interpréteur décrivant comment l'exécution a atteint le point où une exception a été levée. Le lire efficacement - plutôt que de paniquer devant le mur de texte - est l'une des compétences de débogage les plus rentables en Python. Le traceback vous dit exactement où l'erreur est née et chaque appel de fonction qui y a conduit.
Anatomie d'un traceback Python
Un traceback commence par la ligne `Traceback (most recent call last):` et liste les cadres depuis l'appel le plus externe en haut jusqu'au site de l'erreur en bas. Chaque cadre montre le chemin du fichier, le numéro de ligne, le nom de la fonction et la ligne de code source. Les deux dernières lignes affichent la classe d'exception et son message - c'est l'erreur réelle. Lisez de bas en haut : comprenez d'abord le type d'erreur, puis remontez la chaîne d'appels pour trouver où dans votre code la mauvaise valeur est née.
Traceback (most recent call last):
File "main.py", line 42, in <module>
result = process_orders(orders) # outer call - your code
File "orders.py", line 17, in process_orders
total = calculate_total(order) # middle call - your code
File "orders.py", line 31, in calculate_total
return sum(item['price'] for item in order['items']) # origin
KeyError: 'items' # error type + messageDans cet exemple, l'erreur est une `KeyError` sur la clé `'items'`. L'origine est la ligne 31 de `orders.py`. Le traceback vous dit que `order` n'a pas de clé `'items'` - soit la structure de données diffère de ce qui était attendu, soit la clé n'a jamais été définie. Allez à `orders.py:31`, vérifiez ce que contient `order` à ce moment, et ajoutez une garde ou corrigez les données en amont.
Types d'exceptions Python courants et leur signification
- KeyError : Accès à une clé de dictionnaire qui n'existe pas - utilisez `.get(key, default)` ou vérifiez avec `key in d` d'abord.
- AttributeError : Appel d'une méthode ou accès à une propriété inexistante sur l'objet - vérifiez le type de l'objet.
- TypeError : Type incorrect passé à une fonction, ou opération sur des types incompatibles (p. ex. `"text" + 5`).
- ValueError : Type correct mais valeur invalide - `int("abc")`, `math.sqrt(-1)`, ou une fonction rejetant un argument hors plage.
- IndexError : Indice de liste ou de tuple hors limites - la liste est plus courte que supposé.
- ImportError / ModuleNotFoundError : Un module n'est pas installé ou le chemin d'import est erroné.
Tip
Explicateur de tracebacks Python
Collez n'importe quel traceback Python et obtenez une décomposition structurée du cadre d'origine, de la chaîne d'appels et du correctif probable - local au navigateur et totalement privé.
Flake8, Pylint et analyse statique
Les outils d'analyse statique lisent votre code source Python sans l'exécuter et appliquent des ensembles de règles qui attrapent des problèmes invisibles pour un vérificateur de syntaxe - noms non définis, imports inutilisés, fonctions trop complexes et dizaines de motifs associés aux bugs ou à une mauvaise maintenabilité. Flake8 et Pylint sont les deux choix dominants, et servent des points différents du compromis vitesse/profondeur.
Flake8 - rapide, composable, garant PEP 8
Flake8 combine trois outils : pyflakes (détecte les noms non définis, les imports inutilisés et les variables redéfinies), pycodestyle (applique les règles de style PEP 8 - longueur de ligne, espacement autour des opérateurs, lignes vides entre fonctions) et mccabe (signale les fonctions dont la complexité cyclomatique dépasse un seuil configurable). Il s'exécute vite, produit une sortie compacte et bénéficie d'un riche écosystème de plugins - plugins de vérifications de sécurité (`flake8-bugbear`), d'exigence d'annotations de type (`flake8-annotations`) et de règles spécifiques à Django (`flake8-django`).
# Install Flake8
pip install flake8
# Check a single file
flake8 mymodule.py
# Check a directory
flake8 src/
# Ignore specific rules (E501 = line too long)
flake8 src/ --extend-ignore=E501
# Set maximum line length
flake8 src/ --max-line-length=100
# Count errors by code
flake8 src/ --statisticsPylint - analyse approfondie et scoring
Pylint réalise une analyse statique plus profonde que Flake8. Il construit une compréhension complète de la structure de votre module, suit les types des variables entre affectations, vérifie que les signatures de méthodes correspondent à leurs appels et applique un ensemble plus large de conventions. Il produit aussi une note de qualité numérique de 0 à 10 que vous pouvez suivre entre commits. Le contrepoint est la vitesse - Pylint est nettement plus lent que Flake8 sur les grandes bases de code - et la verbosité : une première exécution de Pylint sur un projet non optimisé peut produire des centaines de messages à trier.
Commencez avec Flake8 pour la boucle de retour rapide en CI. Ajoutez Pylint de façon sélective pour les revues de code et les audits pré-publication. Lancez mypy en continu si vous utilisez des annotations de type. Trois outils, trois profondeurs différentes.
Configurer Flake8 avec setup.cfg
Flake8 lit sa configuration depuis `setup.cfg`, `.flake8` ou `tox.ini`. Une configuration minimale qui fixe la longueur de ligne et ignore quelques règles bruyantes garde la sortie exploitable sans étouffer les avertissements importants.
[flake8]
max-line-length = 100
extend-ignore = E203, W503
exclude =
.git,
__pycache__,
migrations/,
venv/
per-file-ignores =
tests/*: S101Note
Vérification de types avec mypy
Mypy est un vérificateur de types statique qui lit les annotations de type Python - `def process(items: list[str]) -> int` - et vérifie que chaque fonction est appelée avec des arguments du bon type et que les valeurs de retour sont utilisées correctement. Il n'exécute pas votre code ; il analyse la structure et déduit les types à partir des annotations que vous fournissez. Les erreurs de type attrapées par mypy ne peuvent pas devenir des exceptions `TypeError` ou `AttributeError` en production.
Ce que mypy attrape et que Flake8 rate
- Incompatibilités de type : Passer un `str` à une fonction qui attend `int`, ou renvoyer `None` d'une fonction typée `-> str`.
- Sécurité des Optional : Appeler une méthode sur une valeur typée `Optional[User]` sans vérifier d'abord la présence de `None`.
- Affectations incompatibles : Affecter un `list[int]` à une variable déclarée `list[str]`.
- Chemins de retour manquants : Une fonction avec une branche ne renvoyant rien alors que le type de retour n'est pas `None`.
- Incompatibilités de surcharge : Appeler une fonction avec la mauvaise combinaison de types d'arguments pour ses signatures surchargées.
Démarrer avec mypy
Mypy peut être adopté de façon incrémentale - pas besoin d'annoter chaque fichier avant d'en tirer de la valeur. Commencez par lancer `mypy src/` avec l'option `--ignore-missing-imports` pour supprimer les erreurs des librairies tierces dépourvues de stubs de types. Concentrez-vous d'abord sur l'annotation des fonctions publiques, des variables de module et des types de retour de fonctions. L'assistant `reveal_type(expr)` (retiré à l'exécution mais traité par mypy) montre le type déduit par mypy pour toute expression - utile quand vous ne comprenez pas pourquoi une vérification échoue.
# Install mypy
pip install mypy
# Basic check - report type errors in src/
mypy src/
# Ignore missing stubs for third-party libraries
mypy src/ --ignore-missing-imports
# Strict mode - enables all optional checks
mypy src/ --strict
# Check a single file
mypy orders.py
# Show error codes (useful for targeted suppression)
mypy src/ --show-error-codesTip
Détection d'erreurs en CI/CD
La vérification manuelle des erreurs pendant le développement est une bonne pratique mais pas une garantie. Automatiser la détection d'erreurs Python dans votre pipeline CI/CD garantit qu'aucune erreur de syntaxe, violation Flake8 ou erreur de type ne puisse être fusionnée dans la branche principale - que le développeur ait ou non exécuté les vérifications localement.
Une garde qualité Python minimale
name: Python Quality
on:
pull_request:
paths: ['src/**/*.py', 'tests/**/*.py']
jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.12'
cache: 'pip'
- run: pip install flake8 mypy
- name: Syntax check
run: python -m compileall src/
- name: Flake8
run: flake8 src/ --max-line-length=100 --statistics
- name: mypy
run: mypy src/ --ignore-missing-importsL'étape `compileall` attrape toute erreur de syntaxe qui empêcherait l'import ; Flake8 attrape les noms non définis, les imports inutilisés et les violations de style ; mypy attrape les erreurs de type. Les trois étapes sortent avec un code non nul en cas d'échec, ce qui bloque la fusion du pull request. Exécuter les vérifications sur `pull_request` plutôt que sur `push` vers `main` signifie que le retour arrive tant que l'auteur peut encore agir dessus, pas après la fusion.
Hooks pre-commit pour l'application locale
Les hooks pre-commit exécutent les mêmes vérifications localement avant la création d'un commit. Le framework `pre-commit` gère cela pour les projets Python - ajoutez un `.pre-commit-config.yaml` référençant les hooks officiels Flake8 et mypy, et chaque contributeur obtient les mêmes vérifications appliquées automatiquement au commit, sans configuration manuelle.
| Outil | Ce qu'il attrape | Vitesse | Confidentialité | Installation requise |
|---|---|---|---|---|
| Validateur de syntaxe Python (Aback Tools) | Erreurs de syntaxe + indentation | Instantanée | ✓ 100% local | Aucune - dans le navigateur |
| python -m py_compile | Erreurs de syntaxe | Rapide | ✓ Local | Python installé |
| Flake8 | Syntaxe + noms non définis + PEP 8 | Rapide | ✓ Local | pip install flake8 |
| Pylint | Analyse profonde + scoring | Lente | ✓ Local | pip install pylint |
| mypy | Erreurs de type | Moyenne | ✓ Local | pip install mypy + annotations |
| Explicateur de tracebacks Python | Analyse d'exceptions à l'exécution | Instantanée | ✓ 100% local | Aucune - dans le navigateur |
Warning
Bonnes pratiques de débogage
De bonnes habitudes de vérification d'erreurs réduisent sensiblement le temps passé à déboguer. Ces pratiques fonctionnent pour les scripts, les applications Django, les pipelines de données et tout autre contexte Python - les outils changent mais les principes restent.
Corrigez la première erreur, pas toutes les erreurs
Les erreurs de syntaxe Python se propagent en cascade - un deux-points manquant à la ligne 10 peut produire trois erreurs signalées distinctes à mesure que le parseur perd le contexte. Corrigez toujours d'abord l'erreur signalée la plus haute, puis relancez le vérificateur. Ce qui ressemblait à cinq bugs n'en est souvent qu'un. Cela vaut aussi pour la sortie de mypy : une seule fonction non annotée peut générer une cascade d'erreurs de type en aval, qui disparaissent toutes dès que l'annotation racine est ajoutée.
Utilisez des annotations de type dès le départ
Annoter les signatures de fonctions au fil de leur écriture coûte un temps négligeable et paie immédiatement : l'autocomplétion de votre éditeur devient précise, mypy attrape les mauvais usages au site d'appel, et la documentation est intégrée au code. Commencez par les signatures de fonctions publiques - paramètres et types de retour - avant de passer aux variables internes. L'import `from __future__ import annotations` active la syntaxe d'évaluation différée qui rend les annotations compatibles avec les anciennes versions de Python.
Validez les données externes à la frontière
La majorité des exceptions `KeyError`, `TypeError` et `AttributeError` en production viennent de données externes - réponses d'API, résultats de requêtes en base, saisies utilisateur ou fichiers de configuration - qui ne correspondent pas à la forme attendue. Utilisez des modèles Pydantic ou des dataclasses pour valider les données entrantes à la frontière, pas au cœur de la logique métier. Pour vérifier les motifs regex utilisés pour analyser du texte externe, le testeur de regex Python valide vos motifs du module `re` en direct sur un échantillon d'entrée, prévenant les exceptions d'exécution liées aux regex avant qu'elles n'atteignent la production.
- Corrigez d'abord la première erreur : Les erreurs de syntaxe se propagent - un problème réel en produit plusieurs signalés.
- Activez Flake8 dans votre éditeur : Le retour en temps réel attrape les erreurs pendant la frappe, pas après le commit.
- Ajoutez mypy progressivement : Annotez d'abord les API publiques ; utilisez `--allow-untyped-defs` pendant la migration.
- Validez les données externes : Les réponses d'API et fichiers de config doivent être vérifiés à la frontière, non supposés corrects.
- Écrivez des tests pour les chemins critiques : Les tests unitaires révèlent des erreurs de logique qu'aucun outil statique ne détecte.
- Utilisez l'explicateur de tracebacks pour les erreurs inconnues : Collez n'importe quel traceback Python pour une décomposition structurée instantanée.
Tip
Key takeaways
- Les erreurs de syntaxe sont détectées avant l'exécution - utilisez le validateur de syntaxe Python pour une vérification instantanée locale au navigateur, ou `python -m py_compile` pour une vérification en CLI sans installation supplémentaire.
- Les tracebacks montrent la chaîne d'appels complète jusqu'à l'erreur - lisez de bas en haut, identifiez le premier cadre dans votre propre code, et utilisez l'explicateur de tracebacks Python pour une décomposition structurée.
- Flake8 combine vérification de syntaxe, détection de noms non définis et application de la PEP 8 en un outil rapide - le choix pratique par défaut pour la plupart des projets Python.
- Pylint réalise une analyse plus profonde et produit une note de qualité, ce qui le rend plus précieux pour les revues de code et les audits pré-publication que pour la vérification à chaque commit.
- Mypy attrape les erreurs de type avant qu'elles ne deviennent des exceptions à l'exécution - adoptez-le progressivement en commençant par les signatures de fonctions publiques.
- Ajoutez `python -m compileall`, Flake8 et mypy à votre pipeline CI/CD pour qu'aucune erreur de syntaxe ou de type ne soit fusionnée sans être détectée.
- N'envoyez jamais de code Python propriétaire à des linters en ligne côté serveur - le validateur de syntaxe Python et l'explicateur de tracebacks d'Aback Tools traitent tout entièrement dans votre navigateur.