'NoneType' object is not iterable
Explication
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
Besoin d'aide sur votre projet ?
Besoin d'aide sur un probleme technique ? Decrivez-le pour des recommandations.
Nous contacter