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 :

Importation de modules et espaces de noms


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 8
    Par défaut Importation de modules et espaces de noms
    Bonjour,

    je developpe en Python depuis qq mois maintenant mais il y a un point qui me cause du souci regulierement: les espaces de noms propres a chaque module. J'etais justement en train de faire le point la-dessus quand je n'ai pas eu le comportement attendu...

    J'ai ecris un petit pure python module a ce propos:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    shell> cat importtest.py
    def execute(string):
        exec(string) in globals()
     
    def globadd(name,value):
        globals()[name] = value
    Quand j'importe le module dans le main python, j'ai le comportement attendu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    >>> import importtest
    >>>
    >>> dir(importtest)
    ['__builtins__', '__doc__', '__file__', '__name__', 'execute', 'globadd']
    >>> importtest.execute('a = 1')
    >>> importtest.globadd('b',2)
    >>> dir(importtest)
    ['__builtins__', '__doc__', '__file__', '__name__', 'a', 'b', 'execute', 'globadd']
    >>> importtest.a
    1
    >>> importtest.b
    2
    Mais quand j'importe les elements du module dans le main:
    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
    >>> from importtest import *
    >>> dir()
    ['__builtins__', '__doc__', '__name__', 'execute', 'globadd']
    >>> execute('a = 1')
    >>> globadd('b',2)
    >>> a
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    NameError: name 'a' is not defined
    >>> b
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    NameError: name 'b' is not defined
    >>> dir()
    ['__builtins__', '__doc__', '__name__', 'execute', 'globadd']
    >>> execute('print a, b')
    1 2
    a et b ont bien une existence.... mais ou??? J'etais persuade que je les retrouverai dans l'espace des noms du main car les fonctions qui les definissent (en tant que variables globales) appartiennent elles-meme au main...

    Question subsidiaire: comment confier a une fonction qui n'est pas dans le code principal (mais importable via 'from monmodule import mafonction') la creation d'une variable globale au main? J'ai plusieurs codes qui en ont besoin et je voulais mutualiser cette fonction dans un meme module (pour m'eviter de maintenir plusieurs fois la meme fonction)...

    Merci

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Par défaut
    Pourquoi ne pas passer le dictionnaire renvoyé par globals() en paramètre?
    Code importtest.py : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def execute(stmt, g):
        exec stmt in g
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> from importtest import execute
    >>> execute('a = 1', globals())
    >>> dir()
    ['__builtins__', '__doc__', '__name__', 'a', 'execute']

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 8
    Par défaut
    Citation Envoyé par oiffrig
    Pourquoi ne pas passer le dictionnaire renvoyé par globals() en paramètre?
    En effet ca semblerait convenir a ma question subsidiaire. Merci donc.

    Mais quel dictionnaire globals ma fonction 'execute' utilise-t-elle dans le cas qui me pose probleme?

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Par défaut
    Citation Envoyé par bahamut00
    Mais quel dictionnaire globals ma fonction 'execute' utilise-t-elle dans le cas qui me pose probleme?
    Apparemment le dictionnaire correspondant au module
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> import importtest
    >>> from importtest import *
    >>> execute('a = 1')
    >>> dir(importtest)
    ['__builtins__', '__doc__', '__file__', '__name__', 'a', 'execute']

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 8
    Par défaut
    Ok merci j'y vois un peu plus clair meme si je trouve ce comportement... surprenant. (Je veux dire le fait que avec 'from mymodule import myfunction', mymodule - et son espace de noms - n'apparait pas a l'utilisateur mais existe manifestement.)

    De toutes facons la solution que tu m'as propose dans ta premiere reponse devrait me convenir. Merci!

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

Discussions similaires

  1. [Débutant]Importer un module dont le nom est dans une chaîne
    Par ProgVal dans le forum Général Python
    Réponses: 19
    Dernier message: 17/02/2010, 17h01
  2. [SQLServer]SQLCLR et espaces de nom devant les modules CLR
    Par elsuket dans le forum Accès aux données
    Réponses: 2
    Dernier message: 04/12/2009, 09h22
  3. Impossible d'importer l'espace de noms System.XML !
    Par soso78 dans le forum VB.NET
    Réponses: 2
    Dernier message: 26/10/2009, 21h32
  4. Importer un espace de nom dans une page aspx
    Par naima2005 dans le forum ASP.NET
    Réponses: 3
    Dernier message: 18/01/2008, 12h10

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