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) ...

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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