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ébutant] Variables globales pour les fonctions d'un module


Sujet :

Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2011
    Messages : 4
    Points : 3
    Points
    3
    Par défaut [Débutant] Variables globales pour les fonctions d'un module
    Bonjour,

    Je suis tout nouveau sur Python.
    J'ai écris un module (readFile.py) permettant de lire des fichier contenant des données scientifiques. Ce module est composé de 4 fonctions. Chaque fonction lit un fichier. Lorsqu'on les appelle, elles lisent le fichier et stockent les variables.
    Ensuite je charge ce module dans ipython en faisant
    j'appelle la fonction et je m'aperçois que le programme principal ne connaît pas les variables. Je me renseigne et je vois qu'il faut déclarer les variables comme globales pour qu'elles soient vues par l'ensemble du programme.

    J'ai donc essayé trois choses qui ne fonctionnent pas.
    Dans le module readFile.py j'ai testé :
    1. de mettre au tout début du module (en dehors des fonctions)

      global var1, var2, ...
      def ...

      def ...
    2. de mettre au début des fonctions global suivi de la liste des variables à exporter

      def read1():
      global var1, var2, ...
    3. les deux

      global var1, var2, ...
      def read1():
      global var1, var2, ...

    seulement toujours la même erreur lorsque je cherche ensuite à voir la variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    In [1]: from ReadFile import *
    scitools.easyviz backend is matplotlib
     
    In [2]: readCpu('TEST')
    Read file TEST_cpu.dat
     
    In [3]: nx
    NameError: name 'nx' is not defined
    Je sais que je pourrais passer en entrée le nom des variables dans les fonctions seulement dans chaque fichier il y a une bonne vingtaine de variable à lire.
    Avez vous une idée car je ne comprends pas très bien comment python fonctionne avec les variables globales.

    Merci d'avance

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 778
    Points
    36 778
    Par défaut
    Salut,
    Lorsque vous faite from XXX import * vous intégrez dans le dictionnaire du module courant (qui fait import) les variables définies dans XXX.
    Si la variable est définie ou modifiée plus tard, vous ne la verrez pas.
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    # readFile.py
    var1 = None
    def toto():
         global var1, var2
         var1 = 'xxx'
         var2 = 'yyy'
    Après le "from XXX import *", var1 contiendra None et sa valeur dans le module qui imprte readFile.py ne sera pas mise à jour après l'appel à toto. De plus, var2 ne sera jamais définie.
    Utilisez plutôt "import readFile" et accédez aux noms de readFile via readFile.var1, readFile.toto ou effectuez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import readFile
    from readFile import toto
    pour pouvoir accéder à la fonction "toto" sans préfixe.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2011
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Merci beaucoup ça fonctionne bien.
    Seulement il n'existe pas une manière pour ne pas utiliser le préfixe lorsque l'on appelle les variables.
    En fortran, on peut déclarer les variables en "public" lors de leur définition. Elles sont alors visibles et modifiables partout. Je sais que ceci peut être dangereux mais lorsque l'on fait un petit programme ça fonctionne bien.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 778
    Points
    36 778
    Par défaut
    Citation Envoyé par guillooom Voir le message
    En fortran, on peut déclarer les variables en "public" lors de leur définition. Elles sont alors visibles et modifiables partout. Je sais que ceci peut être dangereux mais lorsque l'on fait un petit programme ça fonctionne bien.
    Python n'est pas Fortran... et cette gymnastique global/local font de C un faux ami pour le nouveau programmeur Python...

    Pensez étiquette/tags et non "variable".
    La variable est l'objet que vous accédez via une étiquette.
    Un objet peut être accédé par plusieurs étiquettes.
    Et une étiquette est toujours dans une boite.

    Si vous voulez avoir une boîte d'étiquette globales, il vous suffit de faire un module globals.py et d'y déclarer vos objets et étiquettes dedans.

    Chaque "import de globals" vous permettra d'accéder aux objets partagés via le préfixe "globals" (c'est le nom de leur boîte).
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2011
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Je commence à comprendre.

    Juste une dernière question est-ce qu'il existe en python une commande pour inclure un fichier dans un script python. Je veux dire inclure dans le sens copier le texte du fichier dans un autre fichier et non pas importer un module (comme le fait la commande \include en LaTeX).

    Par exemple j'écris un fichier "header.py" qui me servira d'en tête pour un autre fichier "main.py" et dans "main.py" je place une commande du genre
    ce qui copiera l'intégralité du fichier "header.py" dans "main.py" au lieu d'importer le module "header.py". Ainsi l'espace de noms sera le même et je n'aurai plus besoin d'utiliser les suffixes.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 778
    Points
    36 778
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ce qui copiera l'intégralité du fichier "header.py" dans "main.py" au lieu d'importer le module "header.py". Ainsi l'espace de noms sera le même et je n'aurai plus besoin d'utiliser les suffixes.
    exec fait cela mais... module = boîte.
    dans ce cas, vous détruisez la boîte et et la possibilité de partager quoi que ce soit...
    Excepté la définition des fonctions ce qui n'est pas ce que vous cherchez (from XXX import * suffit pour les fonctions).
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2011
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Merci beaucoup pour l'aide.

    Je passe en résolu.

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

Discussions similaires

  1. Astuce pour accès aux variables globales depuis une fonction
    Par manur0 dans le forum Général Python
    Réponses: 0
    Dernier message: 03/09/2009, 14h30
  2. variables globales pour toutes les pages
    Par tetedeturcq dans le forum ASP.NET
    Réponses: 5
    Dernier message: 03/04/2007, 10h28
  3. [Débutant C#]Variable Globale pour deux forms
    Par progfou dans le forum C#
    Réponses: 7
    Dernier message: 20/02/2007, 09h08
  4. Pourquoi une seule valeur de retour pour les fonctions ?
    Par Bruno75 dans le forum Langages de programmation
    Réponses: 33
    Dernier message: 18/01/2004, 13h58
  5. question sur les variables globales et les thread posix
    Par souris_sonic dans le forum POSIX
    Réponses: 5
    Dernier message: 13/06/2003, 13h59

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