Cette limite ne s'applique pas seulement à l' for
boucles, mais pour tous les autres flux de contrôle blocks. La limite pour le nombre de imbriquée de contrôle de flux de blocs est définie à l'intérieur du code.h avec une constante nommée CO_MAXBLOCKS
:
#define CO_MAXBLOCKS 20 /* Max static block nesting within a function */
Cette constante est utilisée pour définir la taille maximale de la pile Python utilise pour exécuter des exceptions et des boucles nommé blockstack
. Cette limite est imposée à tous les objets d'image et est indiqué dans frameobject.h:
int blockstack[CO_MAXBLOCKS]; /* Walking the 'finally' blocks */
La raison la plus probable pour cette limite est de garder l'utilisation de la mémoire à un sain niveau lors de l'exécution de blocs imbriqués. C'est probablement similaire à la limite Python impose sur les appels récursifs. Cette limite peut être vu comme étant appliquée à la compilation.c:
if (c->u->u_nfblocks >= CO_MAXBLOCKS) {
PyErr_SetString(PyExc_SyntaxError,
"too many statically nested blocks");
return 0;
}
Plus de réponses concrètes pourquoi Python a ce spécifique limite et pourquoi ils ne peuvent pas se débarrasser de lui, a été donné par Michael Hudson en 2004, un Python liste de diffusion de la lettre:
Spot sur. Cela a à voir avec le "blockstack', très bien dans un intérieur
détail de Python de la mise en œuvre. Nous aimerions pour se débarrasser d'elle (pas
parce que nous voulons que les gens écrire du code avec plus de 20 for imbriquées
boucles :-) mais ce n'est pas spécialement facile (enfin: les blocs sont les
plus gros problème).
Notez que dans la version 2.6 de Python et de bas, de casser le nombre maximum de boucles imbriquées serait de provoquer un SystemError
pas SyntaxError
. Cela a été changé cependant en Python 3 et à l'arrière-patché pour Python 2.7 donc un SyntaxError
serait déclenché à la place. Cela a été documenté dans #question 27514:
Question n ° 27514: Faire d'avoir trop statique des blocs imbriqués une SyntaxError
au lieu de SystemError.
La raison de ce changement dans les types d'exception a été donné par Serhiy Storchaka :
[...] SystemError n'est pas une exception doit être soulevée. SystemError est pour les erreurs qui ne peuvent pas être produits dans des conditions normales. Il ne doit être causé par une mauvaise utilisation de l'API C ou de piratage Python internes. Je pense que SyntaxError est plus appropriée dans ce cas [...].