'NoneType' object is not subscriptable

Python Erreur courante

Explication

L'erreur `TypeError: 'NoneType' object is not subscriptable` survient quand vous utilisez les **crochets `[]`** (indexation `x[0]`, accès par clé `x["cle"]`, tranche `x[1:3]`) sur une valeur qui vaut `None`. `None` ne contient rien à indexer. Le coupable habituel est une fonction qui renvoie `None` (souvent par oubli de `return`), dont vous indexez ensuite le résultat. ```python def trouver_user(uid): for u in users: if u["id"] == uid: return u # ⚠️ aucun return si non trouvé → la fonction renvoie None user = trouver_user(99) # renvoie None print(user["nom"]) # None["nom"] # TypeError: 'NoneType' object is not subscriptable ```

Causes courantes

- **Fonction qui renvoie `None`** (oubli de `return`) dont vous indexez le résultat. - **`dict.get(cle)`** sur une clé absente renvoie `None`, puis `resultat["autre"]`. - **`re.match()` / `re.search()`** renvoient `None` s'il n'y a pas de correspondance, puis `.group()` ou `[0]`. - **Une recherche en base ou via une API** sans résultat qui renvoie `None`.

1. Vérifiez la valeur avant de l'indexer

user = trouver_user(99)
if user is not None:
    print(user["nom"])
else:
    print("Utilisateur introuvable")

2. Renvoyez explicitement quelque chose

def trouver_user(uid):
    for u in users:
        if u["id"] == uid:
            return u
    return None   # explicite : on documente l'absence

3. Cas des expressions régulières

import re
m = re.search(r"(\d{4})", texte)
if m:                     # ne pas faire m[0] directement
    annee = m.group(1)

4. En production : remontez à la source

Plutôt que d'empiler les if x is not None, corrigez l'endroit qui produit le None (clé manquante, requête vide). Le message ne dit pas quelle variable est None : inspectez la ligne signalée et affichez repr(variable) juste avant.

Comment prevenir cette erreur

- **`dict.get(cle, defaut)`** avec une valeur par défaut sûre. - **Annotez en `Optional[...]`** et activez `mypy` pour repérer les accès non protégés. - **Validez** les retours de fonctions et de requêtes susceptibles d'être vides. - Référence : [docs.python.org — TypeError](https://docs.python.org/fr/3/library/exceptions.html#TypeError).

Besoin d'aide sur votre projet ?

Besoin d'aide sur un probleme technique ? Decrivez-le pour des recommandations.

Nous contacter

Questions frequentes

Quelle différence avec `'NoneType' object is not iterable` ?
`not subscriptable` concerne l'accès par crochets (`x[0]`, `x["cle"]`) ; `not iterable` concerne le parcours (`for ... in x`). Les deux viennent presque toujours d'une valeur `None` inattendue.
Comment éviter l'erreur avec un dictionnaire imbriqué ?
Utilisez `.get()` à chaque niveau : `data.get("user", {}).get("nom")`. Chaque `.get()` renvoie un dictionnaire vide (ou `None`) au lieu de lever l'erreur.

Erreurs similaires

Chaque semaine, le meilleur de la tech francaise

Tendances, salaires, outils et opportunites — directement dans votre boite mail.

Gratuit. Desabonnement en un clic. Pas de spam.