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 :

Assignation d'une variable globale dans une fonction .


Sujet :

Python

  1. #1
    Membre habitué
    Avatar de moithibault
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2009
    Messages : 124
    Points : 142
    Points
    142
    Par défaut Assignation d'une variable globale dans une fonction .
    Bonjour ,
    Je souhaite assigner une variable globale dans une méthode
    (variable qui sert à configurer mon programme) Pour cela je fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    VAR_GLOBALE=None
     
    class MaClasse(object):
        [...]
        def maMethode(self):
             global VAR_GLOBALE
             if ([...]):
                  VAR_GLOBALE=x
             else :
                  VAR_GLOBALE=y
    La variable VAR_GLOBALE reste à None aprés l'appel de cette méthode . Pouvez-vous m'aider , merci!

  2. #2
    Membre éprouvé
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Points : 1 006
    Points
    1 006
    Par défaut
    Bonjour,
    As-tu pensé à créer une instance de MaClasse et à appeler sa méthode maMethode?
    Et au fait, les méthodes de classes ont toujours au moins un paramètre: la classe. Par convention, on le nomme "self".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    VAR_GLOBALE=None
     
    class MaClasse(object):
        def maMethode(self):    #Pour dire a python que c'est une methode de MaClasse
            global VAR_GLOBALE
            if (1):
                VAR_GLOBALE = "La variable a changee"
            else :
                VAR_GLOBALE = "La varialbe a toujours changee"
     
    me = MaClasse()
    me.maMethode()
    print VAR_GLOBALE
    @+ et bon code
    Win 10 64 bits / Linux Mint 18, - AMD A6 Quad: Py27 / Py35
    CONTENU D'UNE QUESTION
    Exemples:
    - Configuration (système d'exploitation, version de Python et des bibliothèques utilisées)
    - Code source du morceau de programme où il y a un bogue
    - Ligne de code sur laquelle le bogue apparaît
    - Erreur complète retournée pas l'interpréteur Python
    - Recherche déjà effectuée (FAQ, Tutoriels, ...)
    - Tests déjà effectués

  3. #3
    Membre habitué
    Avatar de moithibault
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2009
    Messages : 124
    Points : 142
    Points
    142
    Par défaut
    Citation Envoyé par afranck64 Voir le message
    Bonjour,
    As-tu pensé à créer une instance de MaClasse et à appeler sa méthode maMethode?
    Et au fait, les méthodes de classes ont toujours au moins un paramètre: la classe. Par convention, on le nomme "self".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    VAR_GLOBALE=None
     
    class MaClasse(object):
        def maMethode(self):    #Pour dire a python que c'est une methode de MaClasse
            global VAR_GLOBALE
            if (1):
                VAR_GLOBALE = "La variable a changee"
            else :
                VAR_GLOBALE = "La varialbe a toujours changee"
     
    me = MaClasse()
    me.maMethode()
    print VAR_GLOBALE
    @+ et bon code

    Ouioui j'appel bien ma méthode dans mon programme (vérification avec un print() ) Et excuse-moi j'ai oublié le self dans mon exemple ici mais pas dans mon code . Le problème persiste toujours . Je vais essayer de fournir tout les éléments car je n'ai pas été bien clair

    ********************************************************************************************************
    EDIT: Dans cet exemple la situation marche bien :


    fichier test.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    VAR_GLOBALE=1
    class Classe(object):
        def __init__(self):
            pass
        def methode(self):
            global VAR_GLOBALE
            if(1):
     
                VAR_GLOBALE=5
    maclasse=Classe()
    maclasse.methode()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    from test import *
    print VAR_GLOBALE

    Et dans celle-ci voici exactement l'exemple de ma situation (qui ne marche pas) :

    test.py:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    VAR_GLOBALE=1
    class Classe(object):
        def __init__(self):
            pass
        def methode(self):
            global VAR_GLOBALE
            if(1):
     
                VAR_GLOBALE=5
    test2.py:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    from test import *
     
    class ClasseDeux(object):
        def __init__(self):
            pass
        def methode(self):
           maclasse=Classe()
           maclasse.methode()
           global VAR_GLOBALE
           print VAR_GLOBALE
     
    app=ClasseDeux()
    app.methode()

    La methode m'affiche 1 au lieu du 5 souhaité . Cet exemple refléte mon probléme , comment y remédier ? Merci

  4. #4
    Membre régulier
    Profil pro
    Développeur Back-End
    Inscrit en
    Septembre 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Septembre 2007
    Messages : 81
    Points : 106
    Points
    106
    Par défaut
    Essaye a la place de 'print VAR_GLOBALE' un 'print maclasse.VAR_GLOBALE'

  5. #5
    Membre habitué
    Avatar de moithibault
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2009
    Messages : 124
    Points : 142
    Points
    142
    Par défaut
    Citation Envoyé par malick021988 Voir le message
    Essaye a la place de 'print VAR_GLOBALE' un 'print maclasse.VAR_GLOBALE'
    AttributeError: 'Classe' object has no attribute 'VAR_GLOBALE'

  6. #6
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 474
    Points : 9 274
    Points
    9 274
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Ce code fonctionne. J'ai seulement corrigé quelques anomalies d'indentation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    VAR_GLOBALE=None
     
    class MaClasse(object):
        def maMethode(self):
            global VAR_GLOBALE
            if VAR_GLOBALE==None:
                VAR_GLOBALE=1
            else:
                VAR_GLOBALE=2
     
    x = MaClasse()
     
    x.maMethode()
    print VAR_GLOBALE
     
    x.maMethode()
    print VAR_GLOBALE
    Ce qui affiche:

    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  7. #7
    Membre habitué
    Avatar de moithibault
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2009
    Messages : 124
    Points : 142
    Points
    142
    Par défaut
    Je suis d'accord , mais mon problème n'est pas là , regarde mon précédent post :

    http://www.developpez.net/forums/d10...n/#post5674262

    Merci quand même

  8. #8
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonsoir,

    C'est bien trompeur tout cela...
    global ne fait que son travail : mettre la variable dans le dico globals() de l'instance. Ce n'est simplement pas le même.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    VAR_GLOBALE=1
    class Classe(object):
     
        def __init__(self):
            pass
     
        def methode(self):
            if 'VAR_GLOBALE' in globals():
                print ('VAR_GLOBALE est dans le globals() de Classe.methode')
                print ('avec pour valeur', VAR_GLOBALE)
            global VAR_GLOBALE
            if(1):
                VAR_GLOBALE=5
            if 'VAR_GLOBALE' in globals():
                print ('Apres le if VAR_GLOBALE est dans le globals() de Classe.methode')
                print ('avec pour valeur', VAR_GLOBALE)
            return VAR_GLOBALE
     
    def verifglobals():
        print VAR_GLOBALE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    from test import *
     
    class ClasseDeux(object):
        def __init__(self):
            pass
        def methode(self):
           maclasse=Classe()
           global VAR_GLOBALE
           VAR_GLOBALE = maclasse.methode()
           if 'VAR_GLOBALE' in globals():
               print ('VAR_GLOBALE est dans le globals() de ClasseDeux.methode')
               print ('avec pour valeur', VAR_GLOBALE)
           verifglobals()
     
    app=ClasseDeux()
    app.methode()
    Pourquoi ne pas utiliser un dico ou une classe de stockage ? Comme cela on est sur que c'est la même.

    Bon code
    Merci d'utiliser le forum pour les questions techniques.

  9. #9
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Points : 1 384
    Points
    1 384
    Par défaut
    Tu as en fait deux variables globales: test.VAR_GLOBALE et test2.VAR_GLOBALE, la seconde étant créée par "from test import *".

    Voir ici: http://www.developpez.net/forums/d98...globale-locale

  10. #10
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonsoir dividee,

    Citation Envoyé par dividee Voir le message
    Tu as en fait deux variables globales
    D'où le besoin de démystifier le global. global ne fait que mettre l'objet dans le globals().

    Un exemple de base sur le stockage.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    class varclass(object):
        # Exemple rapide de class de stockage.
        _default = 1
        def __init__(self, value=None, name=None):
            if value is not None:
                self._value=value
            else:
                self._value=self._default
            if name:
                self._name = name
            else:
                try:
                    import inspect as ispct # C'est nul mais j'aime ;)
                    self._name = str(ispct.stack()[1][4]).partition('=varclass(')[0][2:].replace(' ', '').replace('self.', '')
                    del(ispct) # idem
                except:
                    print('Pfffffffffff') # idem
            globals()[self._name] = self
     
        def set(self, value):
            self._value = value
     
        def get(self):
            return self._value
     
    class Classe(object):
        def __init__(self):
            self.vc = varclass()
     
        def methode(self):
            if(1):
                self.vc.set(5)
            return self.vc.get()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    from test import *
     
    class ClasseDeux(object):
        def __init__(self):
            pass
        def methode(self):
           maclasse=Classe()
           return maclasse.methode()
     
    app=ClasseDeux()
    print app.methode()
    Merci d'utiliser le forum pour les questions techniques.

  11. #11
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Deux exemples plus proches de ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class stockage():
        VAR_GLOBALE=1
     
    class Classe(object):
        def __init__(self):
            pass
        def methode(self):
            if(1):
                stockage.VAR_GLOBALE=5
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    from test import *
     
    class ClasseDeux(object):
        def __init__(self):
            pass
        def methode(self):
           maclasse=Classe()
           maclasse.methode()
           print stockage.VAR_GLOBALE
     
    app=ClasseDeux()
    app.methode()
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    stockage={'VAR_GLOBALE': 1}
     
    class Classe(object):
        def __init__(self):
            pass
        def methode(self):
            if(1):
                stockage['VAR_GLOBALE']=5
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    from test import *
     
    class ClasseDeux(object):
        def __init__(self):
            pass
        def methode(self):
           maclasse=Classe()
           maclasse.methode()
           print stockage['VAR_GLOBALE']
     
    app=ClasseDeux()
    app.methode()
    Dans les deux cas tu est sur que c'est bien de la même variable, contrairement au global qui la remplace dans l'espace de nom globals().
    Ma réponse et celle de dividee sont courtes donc voici une explication pas à pas.
    Initialise VAR_GLOBALE à 1 dans test.
    Comme le dit dividee importe VAR_GLOBALE dans test2, avec la valeur 1 donc.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
           maclasse=Classe()
           maclasse.methode()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        def methode(self):
            global VAR_GLOBALE
            if(1):
                VAR_GLOBALE=5
    methode modifie VAR_GLOBALE dans son espace de nom globals().
    Tu ne récupère à aucun moment la nouvelle valeur (voir le return dans mon code) et même si tu fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
           global VAR_GLOBALE
           print VAR_GLOBALE
    La valeur reste 1, soit celle de VAR_GLOBALE lors de l'import.
    Un petit print
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    VAR_GLOBALE=1
    class Classe(object):
        def __init__(self):
            pass
        def methode(self):
            global VAR_GLOBALE
            if(1):
                VAR_GLOBALE=5
        def printg(self):
            print globals()['VAR_GLOBALE']
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    from test import *
     
    class ClasseDeux(object):
        def __init__(self):
            pass
        def methode(self):
           maclasse=Classe()
           maclasse.methode()
           maclasse.printg()
           global VAR_GLOBALE
           print VAR_GLOBALE
     
    app=ClasseDeux()
    app.methode()
    print globals()['VAR_GLOBALE']
    Bon code
    Merci d'utiliser le forum pour les questions techniques.

  12. #12
    Membre habitué
    Avatar de moithibault
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2009
    Messages : 124
    Points : 142
    Points
    142
    Par défaut
    Merci pour vos réponses !
    J'ai opté pour un dictionnaire au final (d'autant plus que j'avais plusieurs variables globales) Encore merci

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

Discussions similaires

  1. [rendre une variable globale dans une fonction]
    Par emilek dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 28/07/2009, 18h11
  2. Réponses: 6
    Dernier message: 21/07/2009, 11h37
  3. Réponses: 15
    Dernier message: 27/03/2009, 13h37
  4. Appeler une variable globale dans la fonction eval
    Par Romanops dans le forum Langage
    Réponses: 2
    Dernier message: 03/08/2007, 04h24
  5. Réponses: 11
    Dernier message: 08/02/2006, 16h59

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