Bonjour,
- La fonction test ci-dessous lève une NameError: global name 'x' is not defined.
- Si je décommente la 1ere instruction # exec "", plus de problèmes, et la variable locale x est même updatée lorsque l'on print x. Je croyais qu'écrire dans le dict locals() n'affectait pas les "fastlocals", mais le exec dans execin() force surement la mise à jour entre les 2.
- Si je modifie la signature en def test(x=0), plus de NameError bien sur, mais impossible d'obtenir le comportement précédent.
Pouvez vous m'expliquer comment la présence ou non d'un simple <exec ""> modifie la manière dont un <exec in locals()> affecte réellement le tableau des variables locales ?
Je déduis entre autre de tout ca que <exec .> et <exec . in locals()> sont parfois équivalents mais pas toujours (puisque bien sur exec "x=1" va donner le même résultat et les mêmes effets de bords -ie une mise à jour LocalsToFast- dans tous les cas) ...
1 2 3 4 5 6 7 8 9
|
def execin(obj,where):
exec obj in where
def test():
# exec ""
execin("x=1",locals())
print x
execin("x=2",sys._getframe().f_locals)
print x |
J'ai également essayé de mettre des
ctypes.pythonapi.PyFrame_LocalsToFast(ctypes.py_object(sys._getframe()), ctypes.c_int(1))>
un peu partout sans que cela ne change quoi que ce soit (même effectuer cette action dans un callback passé à sys.setprofile n'a pas changé le comportement décrit.)
Merci d'avance pour vos lumières
Partager