'NoneType' object is not iterable

Python Erreur courante

Explication

L'erreur `TypeError: 'NoneType' object is not iterable` se produit lorsque vous tentez de **parcourir** une valeur qui vaut `None`. En Python, `None` représente l'absence de valeur : une boucle `for`, un dépaquetage (`a, b = ...`), un appel à `list()`, `sum()`, `", ".join(...)` ou l'opérateur `in` ne peuvent rien faire avec. Le déclencheur le plus fréquent : une fonction qui **oublie son `return`** renvoie implicitement `None`, et vous itérez ce résultat. ```python def get_users(): users = ["alice", "bob"] # ⚠️ le return a été oublié → la fonction renvoie None for user in get_users(): # on itère sur None print(user) # TypeError: 'NoneType' object is not iterable ```

Causes courantes

- **Fonction sans `return`** (ou avec un `return` nu) : elle renvoie `None`, que vous parcourez ensuite. - **Méthode « en place »** : `list.sort()`, `list.append()`, `dict.update()`, `random.shuffle()` modifient l'objet et renvoient `None`. Ainsi `x = ma_liste.sort()` met `x` à `None`. - **`dict.get(cle)`** sur une clé absente renvoie `None`. - **Requête sans résultat** : un ORM (Django `.first()`, SQLAlchemy) ou un appel API qui renvoie `None` au lieu d'une liste vide. - **Dépaquetage d'un retour `None`** : `a, b = fonction()` quand la fonction renvoie `None`.

1. Assurez-vous que la fonction renvoie une valeur

def get_users():
    users = ["alice", "bob"]
    return users   # ✅ ne pas oublier le return

2. Itérez en sécurité avec or []

Si la valeur peut légitimement être None, repliez-vous sur une liste vide :

for user in (get_users() or []):
    print(user)

3. Méfiez-vous des méthodes « en place »

nums = [3, 1, 2]
# ❌ trie = nums.sort()    # trie vaut None
nums.sort()                # trie en place, ne renvoie rien
trie = sorted(nums)        # ✅ renvoie une nouvelle liste triée

4. En production : tracez l'origine du None

Quand le None provient d'une couche lointaine (cache, base de données, API), vérifiez près de la source plutôt que près de la boucle, et journalisez le cas :

import logging

users = get_users()
if users is None:
    logging.warning("get_users a renvoyé None (uid=%s)", uid)
    users = []
for user in users:
    ...

Comment prevenir cette erreur

- **Annotez vos types** : `def get_users() -> list[str]:`. Un vérificateur comme **mypy** ou **pyright** signale les chemins qui peuvent renvoyer `None`. - **Convention** : renvoyez une liste vide `[]` plutôt que `None` pour signifier « aucun résultat ». - **Linter** : `ruff` et `pylint` détectent les retours incohérents (`inconsistent-return-statements`). - Référence officielle : [docs.python.org — None](https://docs.python.org/fr/3/library/constants.html#None).

Besoin d'aide sur votre projet ?

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

Nous contacter

Questions frequentes

Pourquoi ma fonction renvoie-t-elle None alors que je n'ai écrit aucun `return None` ?
En Python, toute fonction qui atteint sa fin sans rencontrer d'instruction `return` renvoie automatiquement `None`. Vérifiez que **toutes** les branches (y compris les `if`/`else`) renvoient bien une valeur.
Pourquoi `ma_liste.sort()` déclenche-t-elle cette erreur ?
Parce que `sort()` trie la liste sur place et renvoie `None`. Si vous écrivez `resultat = ma_liste.sort()`, alors `resultat` vaut `None`. Utilisez `sorted(ma_liste)` pour obtenir une nouvelle liste triée.
Comment parcourir une valeur qui peut être `None` sans planter ?
Utilisez `for x in (valeur or []):`, qui se replie sur une liste vide, ou testez explicitement `if valeur is not None:` avant la boucle.

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.