Impact d'exec sur les variables locales : une plongée
La fonction exec, un incontournable de Python pour l'exécution de code dynamique, pose une question intrigante : peut-il mettre à jour les variables locales au sein d'une fonction ?
Le Python 3 Dilemme
Dans Python 3, l'extrait de code suivant ne parvient pas à mettre à jour une variable locale comme on pourrait s'y attendre :
def f(): a = 1 exec("a = 3") print(a)
Au lieu du « 3 » attendu, il affiche de manière alarmante » 1'!
Le Python 2 Comportement
Curieusement, le même code dans Python 2 mettrait effectivement à jour la variable locale, en imprimant '3'. Cette disparité résulte d'un changement fondamental dans la façon dont Python gère les variables locales.
Le dilemme des variables locales
Contrairement à Python 2, Python 3 stocke les variables locales dans un tableau figé optimisé au moment de la compilation. Cette efficacité se fait au prix de l’interdiction des modifications d’exécution au niveau local. Ainsi, l'appel exec par défaut dans Python 3 ne peut pas modifier avec succès les variables locales.
La magie des locaux()
Pour contourner cette limitation et mettre à jour les variables locales, il faut transmettre explicitement un dictionnaire local à exec. Ce dictionnaire stockera les variables locales mises à jour après l'exécution du code dynamique. Le code révisé ressemble à ceci :
def foo(): ldict = {} exec("a = 3", globals(), ldict) a = ldict['a'] print(a)
Implications pour Exec()
La documentation Python 3 met explicitement en garde contre la modification du dictionnaire locals() par défaut lors de l'utilisation de exec , car cela peut conduire à un comportement imprévisible. Pour des raisons de sécurité, il faut toujours transmettre un dictionnaire local explicite à exec lorsque l'on a l'intention de mettre à jour des variables locales.
Les curieuses optimisations de Python
Commentaires perspicaces de Georg Brandl sur Python Le rapport de bug souligne que l'optimisation de Python 3 pour les variables locales a conduit au comportement actuel. Le compilateur, incapable de distinguer les fonctions d'exécution personnalisées de celles de Python, ne peut pas leur offrir un traitement spécial. Par conséquent, l'exécutable par défaut ne peut pas modifier les paramètres locaux.
Exception de Python 2
Dans Python 2, l'ancienne instruction exec fonctionnait différemment. Il permettait de modifier dynamiquement les variables locales grâce à la gestion spéciale par le compilateur de l'exécutable intégré.
Conclusion
L'appel exec dans Python 3 nécessite un subtil changement d’approche pour modifier les variables locales. En utilisant un dictionnaire de variables locales explicites, les développeurs peuvent exploiter la puissance de l'exécution de code dynamique tout en gardant le contrôle sur leurs variables locales.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!