Accueil·Messages d’erreur

python · Python

Le message

RecursionError: maximum recursion depth exceeded

Ce que cela veut dire

Une fonction s'est appelée elle-même plus profondément que la limite par défaut de 1000 cadres. Bien plus souvent qu'un calcul réellement profond, cela signifie que la condition d'arrêt manque ou n'est jamais atteinte ; la récursion indirecte compte aussi, par exemple un __getattr__ ou une property qui relit son propre attribut. Repérez les deux ou trois cadres qui se répètent dans la trace et corrigez d'abord le cas de base. sys.setrecursionlimit() relève bien le plafond, mais vous laisse dépasser la vraie pile C, et Python meurt alors d'un coup au lieu de lever une exception : réécrire la récursion en boucle est la réponse sûre.

Le correctif

Pas de commande en une ligne ici. L’explication dit où regarder.

Émis par
python
Python
18

Une trace Python coupe la réponse en deux : la dernière ligne dit ce qui a échoué, les cadres au-dessus disent où — ne lire que la dernière ligne donne le nom et fait perdre l'endroit ; et pour les erreurs de valeur absente comme NoneType et KeyError, la cause siège presque toujours dans un cadre au-dessus de celui qui a planté.

Lire un message d’erreur

  • Lisez à partir de la première ligne. Plus on descend, plus il s’agit des entrailles de l’outil ; la cause est généralement en haut.
  • S’il y a un fichier et un numéro de ligne, commencez là — pas la première image de la pile, mais la ligne la plus haute qui nomme un fichier de vous.
  • Cherchez le message tel quel, mais retirez d’abord vos chemins et vos noms de variables : c’est cela qui empêche la correspondance.
  • La même situation se formule autrement selon la version de l’outil. Si les résultats sonnent faux, ajoutez le numéro de version.
  • Avant de coller un correctif, vérifiez ce qu’il jette. Certains sont irréversibles.

Questions fréquentes

Q. Que veut dire « RecursionError: maximum recursion depth exceeded » ?

Une fonction s'est appelée elle-même plus profondément que la limite par défaut de 1000 cadres. Bien plus souvent qu'un calcul réellement profond, cela signifie que la condition d'arrêt manque ou n'est jamais atteinte ; la récursion indirecte compte aussi, par exemple un __getattr__ ou une property qui relit son propre attribut. Repérez les deux ou trois cadres qui se répètent dans la trace et corrigez d'abord le cas de base. sys.setrecursionlimit() relève bien le plafond, mais vous laisse dépasser la vraie pile C, et Python meurt alors d'un coup au lieu de lever une exception : réécrire la récursion en boucle est la réponse sûre.

Q. Comment le corriger ?

Pas de commande en une ligne. L’explication ci-dessus dit où regarder.

Q. Quel outil émet cela ?

python. Cela relève de Python, et le message compte 5 mots.

Erreurs voisines