A propos de exec()

Bonjour,
je suis avec Python 33
j'ai besoin de faire exécuter exec dans une fonction et ça ne fonctionne pas§

Je ne comprends pas pourquoi dans un script :
exec('toto=[1,2,3]')
print(toto)

renvoie bien [1,2,3] dans le shell

et pourquoi
def fct():
exec('toto=[1,2,3]')
print(toto)

fct()

dans le même script renvoie une erreur "global name toto undefined"

2 réponses

  1. Contributeur
    'lut, la version 3 a introduit plein de changements; dont la manière dont on gère les variables/fonctions accessibles par
    exec
    .
    Quand on regarde la doc, on s'aperçoit que 2 paramètres peuvent être ajoutés: ils servent à définir les objets accessibles par le code, le premier étant les variables globales (donc on ne va rien mettre vu que ton code ne fait qu'une assignation; les variables builtin sont ajoutées toutes seules si absentes de toute façon), le deuxième étant un conteneur pour les variables locales; vide par défaut, qui se remplira.

    Un exemple sera probablement plus compréhensible:
    def fct():
        variables = {}
        exec('toto=[1,2,3]', {}, variables)
        print(variables["toto"])
    
    fct()

    $ python3.3 test.py                                                                                                                                                
    [1, 2, 3]

    Ça marche!
    EDIT: mais comme fred1599 le dit,
    exec
    c'est pas bien!
    from human import idiocy
    del idiocy
    1. La façon dont tu conçois ton code doit être mauvaise, exec est une très mauvaise pratique.

      Tu pourrais peut-être expliqué le pourquoi tu as besoin d'utiliser exec, on trouvera sans doute une solution bien plus jolie et pythonnique.