IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Définir une fonction avec exec() dans une fonction =>Problème


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 53
    Par défaut Définir une fonction avec exec() dans une fonction =>Problème
    Bonjour,
    Quelqu'un pourrait m'expliquer la différence de comportement entre ces deux codes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    t="def add(a,b):\n\treturn a+b"
    def truc(t):
        exec(t)
        print(add(8,9))
    truc(t)
    NameError : name 'add' is not defined

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    t="def add(a,b):\n\treturn a+b"
    exec(t)
    print(add(8,9))
    17

    Sachant que mon objectif serait un truc comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    t="def add(a,b):\n\treturn a+b"
     
    def truc(t):
        exec(t)
     
    truc(t)
    print(add(8,9))
    (mais qui fonctionnerait)

    Merci d'avance.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Si on écrit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    t="def add(a,b):\n\treturn a+b"
    def truc(t):
        exec(t)
        print(add(8,9))
    On suppose que l'appel à la fonction exec ira modifier l'espace locals() (les variables accessibles par la fonction). Mais c'est impossible.

    Alors que quand on écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    t="def add(a,b):\n\treturn a+b"
    exec(t)
    exec modifie l'espace globals(), ce qui est permis.

    Çà c'est le fonctionnement par défaut d'exec, et rien n'interdit de lui passer un espace de noms spécifique... comme indiqué dans la documentation.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 53
    Par défaut
    Ok merci
    Je pige pas trop par contre j'obtiens ce que je veux en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    t="def add(a,b):\n\treturn a+b"
    def truc(t):
        print(t)
        exec(t, globals(),globals())
     
    truc(t)
    print(add(8,9))

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Citation Envoyé par PaM... Voir le message
    Je pige pas trop par contre j'obtiens ce que je veux en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    t="def add(a,b):\n\treturn a+b"
    def truc(t):
        print(t)
        exec(t, globals(),globals())
    truc(t)
    print(add(8,9))
    Parce que dans ce cas, vous définissez une variable "globale" (ce qui est toujours possible même à l'intérieur d'une fonction).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Nombre de lignes avec exec dans procédure stockée
    Par Stephane_br dans le forum Développement
    Réponses: 20
    Dernier message: 20/11/2018, 12h20
  2. [MLD] définir un MLD avec merise dans médiathèque
    Par admaria dans le forum Schéma
    Réponses: 14
    Dernier message: 04/01/2009, 18h42
  3. [SQL SERVER 2005] Utilisation de Exec dans une fonction ?
    Par Dadou74 dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 22/09/2006, 22h09
  4. [8i][PL/SQL] erreur avec lpad dans une fonction
    Par sali dans le forum Oracle
    Réponses: 3
    Dernier message: 16/03/2006, 06h22
  5. [PL SQL] Problème avec 'case' dans une fonction
    Par divail dans le forum Oracle
    Réponses: 14
    Dernier message: 13/03/2006, 15h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo