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 :

Méthodologie d'import dans un module


Sujet :

Python

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 22
    Points : 6
    Points
    6
    Par défaut Méthodologie d'import dans un module
    Bonjour,

    Je suis actuellement confronté à un problème d'import pour un programme que je suis en train de réaliser
    Le programme est composé d'un module étant une bilbiothèque de fonctions assez génériques qui seront utilisées dans le programme.
    Ce module étant assez important, j'ai souhaité le diviser en plusieurs modules et les regrouper dans un package.
    Toutefois je suis confronté à un problème au sein même de ce package.

    Certaines fonctions d'un premier module vont appeler des fonctions annexes d'un autre module qui sont plus spécifiques mais ce module va lui, faire appel à des fonctions du premier module qui sont plus génériques.

    Je sais que les imports circulaires sont à éviter à tout prix mais je ne sais pas trop comment m'y prendre pour résoudre le problème.

    Toute idée ou conseil est le bienvenu !

    Merci

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Voilà l'astuce que j'utilise (Python 2.7). Dans le fichier du module importé, je place:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    from sys import modules
    progmain = modules['__main__']
    Et dans ce module, on peut utiliser les objets du programme principal en les précédant par "progmain":

    exemple: "progmain.toto()" appelle la fonction toto() du programme principal

    L'avantage est qu'on évite ainsi les importations circulaires. Mais je ne sais pas s'il y a d'autres inconvénients: je n'en ai pas vu jusqu'à présent.
    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

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 22
    Points : 6
    Points
    6
    Par défaut
    Merci, je vais regarder ça de plus près.

    Mais est-ce que cela marche si le module "principal" n'est pas le module "__main__" ?
    Je veux dire par là que le programme principal A va importer le package contenant B et C et le problème d'import mutuel se situe entre B et C.

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Je viens d'essayer: ça n'a pas l'air de marcher...

    Un article de la FAQ donne des infos sur les importations circulaires (http://python.developpez.com/faq/?pa...tionCirculaire). Mais je n'en sais pas plus.

    Confronté à ce genre de problème, ma réaction est: je change le contenu des fichiers pour que ça n'arrive pas...
    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

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Confronté à ce genre de problème, ma réaction est: je change le contenu des fichiers pour que ça n'arrive pas...
    C'est d'abord une question de dépendance "a => b => a" peut se ré-écrire
    "a => g, a => b => g" - i.e. les fonctions génériques à a et b sont dans un module "ad hoc". A défaut, et hors import, çà ne va pas être simple à "tester".

    Pour les cas désespérés, il faut utiliser la propriété ci dessous:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def f():
        print (sys.stdout)
     
    import sys
    Rien n'empêche de définir une fonction f avec des références dans une autre module "pourvu" que l'import ait eu lieu avant d'appeler f.

    Appliqué au référence circulaire => mettre les imports "en fin du script".

    Voir aussi la FAQ Python qui suggère d'inclure l'import circulaire dans le block de la fonction.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    En fait, ma solution marche! Mon test n'était pas bon, parce que je n'avais pris en compte l'ordre dans lequel les importations fonctionnent.

    Pour le test, je définis 3 fichiers: main.py, qui importe b.py, qui importe c.py.

    Contenu de main.py:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
    import sys
     
    import b
    Contenu de b.py:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
    import sys
     
    AAA = "titi"
    def BBB(x, y):
        print AAA
        return x*y
     
    import c
    Contenu du fichier c.py:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
    import sys
     
    progb = sys.modules['b']
     
    print progb.BBB(2,3)
    print progb.AAA
    Comme on peut le voir dans le fichier b.py, l'instruction d'importation de 'c' est à la fin du script (comme le dit wiztricks). C'est nécessaire quand on veut accéder à des fonctions de b à partir de c pendant l'importation de c, puisque pendant cette importation, l'exécution de b s'est arrêté à la ligne "import c" et les fonctions de b qui suivent sont encore inconnues de l'interpréteur.

    Mais si ce n'est pas le cas, et qu'on veuille accéder aux fonctions de b à partir de c une fois les 2 importations terminées de b et de c, il n'y a plus de problèmes, et on peut conserver l'import de c au début de b.
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 22
    Points : 6
    Points
    6
    Par défaut
    Merci pour toutes ces précisions, je teste ça sur mon code.

Discussions similaires

  1. [Python 3.X] Import dans des modules? Comment faire et quelles sont les bonnes pratiques?
    Par Davjack dans le forum Général Python
    Réponses: 2
    Dernier message: 03/07/2014, 12h13
  2. [AC-2007] Outil import Requêtes et modules dans SQL server
    Par Trady dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 05/12/2012, 10h50
  3. Présence d'import dans un fichier d'import "Module" perso
    Par cyberclown dans le forum Général Python
    Réponses: 2
    Dernier message: 15/07/2012, 14h39
  4. Réponses: 4
    Dernier message: 14/03/2009, 02h45
  5. Executer une fonction dans un module pas encore importe
    Par Aragorn_destroy dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 20/06/2007, 14h21

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