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 :

Portée des variables et des fonctions


Sujet :

Python

  1. #1
    Membre expérimenté
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 181
    Par défaut Portée des variables et des fonctions
    Bonjour,

    J'ai voulu découper un projet, qui tenait jusqu'à présent dans un seul fichier, en plusieurs modules.
    Mais j'ai quelques soucis : je ne peux pas faire de références à mes variables, ni appeler mes fonctions qui sont contenues dans mon fichier principal, depuis le fichier importé (j'obtiens un NameError).
    Le mot-clef global ne marche pas dans le fichier importé.
    Comment faire ?

    J'ai aussi une autre question : je me suis rendu compte qu'il faut importer les bibliothèques utilisées dans chacun de mes modules.
    Donc je me retrouve avec des import [...] from [...] quasiment identiques dans chaque fichier. Ça ne gaspille pas de la mémoire pour rien ?

    Merci.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 93
    Par défaut
    Effectivement, si tu as des imports qui se répètent, il vaut mieux les regrouper dans le module principal. Je ne sais pas l'impact sur la mémoire, mais c'est surtout plus rapide de ne pas réimporter les modules plusieurs fois.

    Pour ce qui est de tes variables etc., tu peux importer les modules composant ton projet de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from mon_module import *
    Tout le contenu des modules importés comme cela sera accessible comme s'il faisait partie du module principal.

  3. #3
    Membre expérimenté
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 181
    Par défaut
    Salut, merci pour ta réponse.

    Citation Envoyé par Vladislav IV
    Tout le contenu des modules importés comme cela sera accessible comme s'il faisait partie du module principal.
    Non, mon soucis est que je veux écrire dans une variable identique partagée entre deux modules (et pas seulement y accéder en lecture).
    Le problème est que Python définit un espace de nommage pour chaque module, donc si j'affecte une valeur à une variable importée, cette nouvelle valeur n'existera que dans le module principal, en effet la variable dans le module importé conserve sa valeur d'origine.

    Bon, je sais que c'est un peu crade comme manière de programmation, et je ne serais pas étonné d'apprendre que c'est tout simplement impossible, car c'est assez en contradiction avec le fonctionnement des espaces de nommage...

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 93
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from mon_module import *
    Cette syntaxe importe des éléments du module dans le même espace de noms que le module principal, donc les variables importées peuvent être modifiées, et les autres modules verrons cette variable mise à jour.

    Il faut par contre importer les modules dans l'espace de noms principal, pour que tous les éléments y soient réunis. De cette façon, tout ce petit monde fera référence aux mêmes variables globales.

    J'espère avoir répondu à ta question, je ne suis pas sûr de comprendre ce que tu veux vraiment faire. Pourquoi ne pas simplement mettre les variables globales dans le module principal ? Il n'y a pas de raisons d'avoir plusieurs variables avec la même signification.

  5. #5
    Membre expérimenté
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 181
    Par défaut
    [En retard, désolé mon routeur a claqué]

    Citation Envoyé par Vladislav IV
    les autres modules verrons cette variable mise à jour.
    Hum, non.
    Peut-être qu'un bout de code sera plus explicatif ?
    Soit le script module.py :
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    def afficher():
            print "foobar vaut :", foobar
     
     
    foobar = 42

    Puis, dans mon shell python :
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    >>> from module import *
    >>> foobar
    42
    >>> afficher()
    foobar vaut : 42
    >>> foobar = 0
    >>> afficher()
    foobar vaut : 42

    foobar est bien commun aux deux espaces de noms en lecture, mais si j'y accède en écriture, la variable est copiée dans l'espace de noms principal, le foobar de module n'est pas modifié.
    C'est le même principe que les attributs de classes avec les attributs d'instances : si un objet accède en écriture à un attribut de sa classe, alors l'attribut est copié et devient un attribut d'instance (et l'attribut de la classe n'est pas modifié). En plus dans le modèle objet de python, les modules sont des objets.

    Citation Envoyé par Vladislav IV
    Pourquoi ne pas simplement mettre les variables globales dans le module principal ? Il n'y a pas de raisons d'avoir plusieurs variables avec la même signification.
    Comme je l'ai dit au début, c'est suite au découpage en plusieurs modules, je voulais qu'un même paramètre puisse être modifié par différentes fonctions, appartenant à différents modules.
    Mais depuis j'ai résolu mon problème, j'ai abandonné mon système de fonctions pour tout ré-écrire en utlisant la programmation objet, c'est beaucoup plus propre et ça marche

    Bon, on peut dire que c'est résolu, mais si on peut clore ce topic en se mettant d'accord sur le fait que c'était bien impossible... (en plus d'être crade)...

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 93
    Par défaut
    Au temps pour moi ! C'est vrai que c'est crade et que ça marche pas

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

Discussions similaires

  1. [Bash] Modifier des variables extérieure à la fonction
    Par Quetzalcoatl dans le forum Autres langages pour le Web
    Réponses: 0
    Dernier message: 07/12/2007, 14h27
  2. [D5] Créer dynamiquement des variables dans une fonction
    Par MelkInarian dans le forum Delphi
    Réponses: 11
    Dernier message: 14/04/2007, 12h16
  3. Réponses: 4
    Dernier message: 09/08/2006, 15h14
  4. [AS2] déclarer des variables dans une fonction
    Par ooyeah dans le forum ActionScript 1 & ActionScript 2
    Réponses: 12
    Dernier message: 02/08/2005, 12h50
  5. petit souci avec des variables avec des fonctions psql
    Par dust62 dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 02/04/2005, 13h45

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