Partage
  • Partager sur Facebook
  • Partager sur Twitter

[RESOLU] Importer une seule fois un module

Sujet résolu
    26 août 2014 à 20:15:52

    Bonjour,

    comment peut-on importer une seule fois un module pour éviter les inclusions infinies ?

    Merci

    -
    Edité par alihawari 28 août 2014 à 11:28:04

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      26 août 2014 à 20:35:25

      bah juste import "module" si dedans "module" il ne s'importe pas lui meme
      • Partager sur Facebook
      • Partager sur Twitter
        26 août 2014 à 21:02:16

        non, ce n'est pas ça.

        Imagine que j'ai un fichier 1 et un fichier 2, dans le fichier 1 j'ai besoin d'importer le fichier 2 et dans le fichier 2, j'ai besoin d'importer le fichier 1. J'aimerais pouvoir faire ça sans qu'ils ne s'importent plus qu'une fois.

        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          26 août 2014 à 22:23:03

          Pourquoi il s'importeraient plus d'une fois ? Et de toute manière, deux fichiers qui s'importe mutuellement ne sert que rarement.
          • Partager sur Facebook
          • Partager sur Twitter
            27 août 2014 à 9:48:01

            Le problème est que quand je fais ça, je ne peux pas accéder au variables et fonctions, donc je pense qu'il y a une importation infinie, ce que m'a confirmé une personne très proche du langage.
            • Partager sur Facebook
            • Partager sur Twitter
              27 août 2014 à 9:49:57

              Salut,

              Comment importe-tu tes fichiers? Avec l'étoile: from fichier1 import *?

              • Partager sur Facebook
              • Partager sur Twitter
              Précepte: Le mieux est l'ennemi du bien
              Anonyme
                27 août 2014 à 10:16:03

                Sinon tu met le contenu de tes fichiers dans des def que tu appel que quand tu veux mais tu les fusionnes : contenu fichier 2 dans le fichier 1 et tu supprimes fichier 2
                • Partager sur Facebook
                • Partager sur Twitter
                  27 août 2014 à 10:46:12

                  "Sinon tu met le contenu de tes fichiers dans des def"

                  Mauvaise idée. Les variables sont LOCALES dans une fonction. Pour y avoir accès, il faudrait renvoyer chacune d'elles. Ce qui au final représente beaucoup d'effort pour rien.

                  Je vois 3 cas possibles (à chaque fois je me placerai dans le fichier1, et c'est le fichier2 qu'on importera):

                  1. Tu importe chaque fichier dans un espace dédié. Dans ce cas, tu regarde si le nom de cet espace est dans l'espace des noms principal. RAPPEL: Chaque variable, fonction, etc... est listé dans la méthode globals():

                  #Tu remplace ton actuelle importation par:
                  if fichier2 not in globals():
                      import fichier2


                  2. Tu importe chaque fichier avec l'étoile. Dans ce cas, c'est une fonction ou une variable que tu prendra comme repère:

                  #imaginons que dans le fichier2 tu es une variable VAR2
                  if VAR2 not in globals():
                      from fichier2 import *


                  REMARQUE: Pour utiliser ces 2 techniques, il faut que tu ne les modifies plus. Pourquoi? Imaginons que tu modifie la valeur d'une fonction ou d'une variable de ton fichier2. Comme celui-ci existe déjà dans ton espace principal, il ne sera pas rechargé. Pour prendre en compte les modifications, il faut soit relancé le terminal, soit effacer le nom sur lequel on fait le test: del fichier2 ou del VAR2.


                  3. La meilleure solution: repenser ton code. Si tu dois importer le fichier1 dans le fichier2 et le fichier2 dans le fichier1, c'est qu'il y a un problème de conception (comme l'a souligné AZ ;)). Aussi, le meilleur serait juste de mettre dans un fichier toutes les fonctions/variables/constantes et dans l'autre mettre le corps principal du programme. Ainsi tu n'aurait plus qu'un fichier à importer :lol:

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Précepte: Le mieux est l'ennemi du bien
                    27 août 2014 à 11:05:32

                    Au delà d'une mauvaise conception du projet, ce cas peut arriver notamment lorsque l'on utiliser __init__.py pour regrouper et structurer les objets d'un modules qui serait dans plusieurs fichiers sources .

                    Tu me diras, que si l'on arrive dans ce cas, c'est qu'il faut avoir deux modules et non un seul ! , je suis d'accord, mais parfois l’évolution d'un projet qui grossit n'est pas si évident à refactorer, et dans ce cas, si des modules s’intègrent mutuellement ( sans le vouloir, à cause du __init__.py ), alors l'import dans la méthode est la seul solution simple ( à ma connaissance )

                    Maintenant il est vrai que si l'on peu éviter ce cas de figure .. faut pas hésiter .

                    Ch.

                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      27 août 2014 à 11:21:20

                      Je crois que l'on appel cela des imports circulaires ; module A importe module B, qui lui-même importe module A. Selon la méthode d'import cela déclenche soit une ImportError, soit un AttributeError. Ce n'est pas un import infini, ce n'est pas possible en Python où les modules ne sont chargé réellement qu'une seule fois.

                      Comme l'ont dit mes voisins du dessus (sont bruyant, c'est pas possible :p ), il faut considérer ce problème comme un problème de conception et trouver une solution pour que ce qui est dépendant à plusieurs modules se retrouve dans un module à part.

                      Ou, dans certains cas aussi précis que rare, où il n'est pas possible ou incohérent de créer un module commun, on se retrouve obligé d'adopter la technique dégueulasse de l'import dans les fonctions. :beurk:

                      Sans un minimum de code source pour étayer ton problème, il sera difficile de t'apporter la bonne solution et mon pessimisme me laisse croire que tu vas choisir la plus dégueulasse de toutes...

                      • Partager sur Facebook
                      • Partager sur Twitter
                        27 août 2014 à 11:28:22

                        Merci beaucoup je vais essayer de réorganiser mon code, J'ai déjà les fonctions prêtes, je n'ai plus qu'à les réorganiser.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          28 août 2014 à 11:27:35

                          Bonjour,

                          j'ai réussi à faire fonctionner le code: j'avais complètement zappé que je pouvais envoyer des paramètres aux fonctions.

                          Merci beaucoup !

                          • Partager sur Facebook
                          • Partager sur Twitter

                          [RESOLU] Importer une seule fois un module

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown