Partage
  • Partager sur Facebook
  • Partager sur Twitter

problème import

Sujet résolu
    10 mars 2015 à 15:56:38

    Bonjour
    Voici mon problème : 
    J'ai deux classes imbriquées l'une dans l'autre comme ceci
    class B:
        def __init__(self,variable):
            self.attribut = variable
    
        def nouvelObjet(self,variable):
            NouvObjet = A(variable+self.attribut)
            return NouvObjet
    
    
    class A:
        def __init__(self,variable):
            self.attribut = variable
            self.Objet = B(variable)
            print("A(",variable,")")
    
        def fonction(self,variable):
            NouvObjet = self.Objet.nouvelObjet(variable)
            print(NouvObjet.attribut)
    
    Aucun soucis tout fonctionne
    >>>objet = A(1)
    A( 1 )
    >>> objet2 = objet.fonction(2)
    A( 3 )
    
    maintenant j'ai besoin de les mettre en module car évidemment j'ai fait une synthèse de ces classes, mais elles comportent beaucoup plus de lignes de code.
    j'ai donc en premier A.A.py: 
    from general.B import B
    class A:
        def __init__(self,variable):
            self.attribut = variable
            self.Objet = B(variable)
            print("A(",variable,")")
    
        def fonction(self,variable):
            NouvObjet = self.Objet.nouvelObjet(variable)
            print(NouvObjet.attribut)
    

    et ensuite general.B.py: 
    from A.A import A
    class B:
        def __init__(self,variable):
            self.attribut = variable
    
        def nouvelObjet(self,variable):
            NouvObjet = A(variable+self.attribut)
            return NouvObjet
    

    mais lorsque j’exécute mon programme principal : 
    main.py
    from A.A import A
    objet = A("1")
    objet.fonction(2)
    
    j'ai ça : 
    >>> 
    Traceback (most recent call last):
      File "/home/cyril/Documents/programmation/python/main.py", line 1, in <module>
        from A.A import A
      File "/home/cyril/Documents/programmation/python/A/A.py", line 1, in <module>
        from general.B import B
      File "/home/cyril/Documents/programmation/python/general/B.py", line 1, in <module>
        from A.A import A
    ImportError: cannot import name A
    
    Evidemment si j'enlève le from A.A import A de B.py
    j'ai :
    >>> 
    A( 1 )
    Traceback (most recent call last):
      File "/home/cyril/Documents/programmation/python/main.py", line 3, in <module>
        objet.fonction(2)
      File "/home/cyril/Documents/programmation/python/A/A.py", line 9, in fonction
        NouvObjet = self.Objet.nouvelObjet(variable)
      File "/home/cyril/Documents/programmation/python/general/B.py", line 7, in nouvelObjet
        NouvObjet = A(variable+self.attribut)
    NameError: global name 'A' is not defined
    >>> 
    
    quelqu'un à une idée de l'erreur ? merci
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      10 mars 2015 à 16:05:39

      Salut ! Je crois que tu as un problème d'importation circulaire, c'est-à-dire que ton premier fichier appelle le deuxième, et le deuxième appelle le premier. Je crois que si tu utilises import... au lieu de from...import... dans les deux fichiers, le problème sera résolu.
      • Partager sur Facebook
      • Partager sur Twitter
        19 mars 2015 à 10:37:09

        Merci Guillaume désolée je n'ai pas eu beaucoup de temps pour revenir sur mon projet : 

        alors je m..... complètement car voilà ce que j'ai fait : 

        A.py

        import general.B as B
        class A:
            def __init__(self,variable):
                self.attribut = variable
                self.Objet = B(variable)
                print("A(",variable,")")
        
            def fonction(self,variable):
                NouvObjet = self.Objet.nouvelObjet(variable)
                print(NouvObjet.attribut)

        et B.py

        import A.A
        class B:
            def __init__(self,variable):
                self.attribut = variable
        
            def nouvelObjet(self,variable):
                NouvObjet = A.A(variable)
                return NouvObjet
        

        avec main.py  identique et j'ai : 

        >>> 
        Traceback (most recent call last):
          File "/home/cyril/Documents/programmation/python/main.py", line 2, in <module>
            objet = A(1)
          File "/home/cyril/Documents/programmation/python/A/A.py", line 5, in __init__
            self.Objet = B(variable)
        TypeError: 'module' object is not callable
        >>> 

        Y a un truc que j'ai pas du comprendre dans les imports !!!!!



        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          19 mars 2015 à 11:03:11

          import ou from import ne changera rien au problème d'import circulaire.

          Si la classe A a besoin de la classe B et que la classe B a besoin de la classe A, c'est certainement qu'il y a un problème de conception. Pourquoi l'une à besoin de l'autre ? Si tu as une bonne raison à cela, alors demande-toi pourquoi définir ces classes dans des modules différents ?


          sirius911 a écrit:

          Merci Guillaume désolée je n'ai pas eu beaucoup de temps pour revenir sur mon projet : 

          alors je m..... complètement car voilà ce que j'ai fait : 

          A.py

          import general.B as B
          class A:
              def __init__(self,variable):
                  self.attribut = variable
                  self.Objet = B(variable)
                  print("A(",variable,")")
          
              def fonction(self,variable):
                  NouvObjet = self.Objet.nouvelObjet(variable)
                  print(NouvObjet.attribut)

          et B.py

          import A.A
          class B:
              def __init__(self,variable):
                  self.attribut = variable
          
              def nouvelObjet(self,variable):
                  NouvObjet = A.A(variable)
                  return NouvObjet
          

          avec main.py  identique et j'ai : 

          >>> 
          Traceback (most recent call last):
            File "/home/cyril/Documents/programmation/python/main.py", line 2, in <module>
              objet = A(1)
            File "/home/cyril/Documents/programmation/python/A/A.py", line 5, in __init__
              self.Objet = B(variable)
          TypeError: 'module' object is not callable
          >>> </module>

          Y a un truc que j'ai pas du comprendre dans les imports !!!!!



          Là c'est un autre problème, tu essaies d'appeler general.B alors que c'est un module, pas la classe B, qui doit surement être general.B.B ?

          -
          Edité par Anonyme 19 mars 2015 à 11:07:32

          • Partager sur Facebook
          • Partager sur Twitter
            19 mars 2015 à 11:46:27

            Merci Celthon ta dernière remarque m'a permis de corriger et finalement de faire fonctionner l'exemple j'ai donc :

            A.py :

            import general.B as B
            class A:
                def __init__(self,variable):
                    self.attribut = variable
                    self.Objet = B.B(variable)
                    print("A(",variable,")")
            
                def fonction(self,variable):
                    NouvObjet = self.Objet.nouvelObjet(variable)
                    print(NouvObjet.attribut)
            

            B.py 

            import A.A
            class B:
                def __init__(self,variable):
                    self.attribut = variable
            
                def nouvelObjet(self,variable):
                    NouvObjet = A.A.A(variable)
                    return NouvObjet
            

            Par contre je trouve ça super lourd le A.A.A !!!

            Pour ce qui est de la conception, et en simplifiant au maximum : 

            J'ai un objet A qui a comme attributs des coordonnées d'un Objet Complex B représentant un espace fermé.

            L'objet A a besoin d'utiliser des fonctions internes de B  il crée  donc des instances de B lance ces fonctions qui ont besoin de créer des objets A (différent de l'objet A du départ) pour renvoyer des informations sur l'environnement  inter-agissant avec A.
            Je sais pais si c'est très clair !!! la structure fonctionne très bien en Java et en PHP, mais je ne vois pas comment simplifier la conception pour arriver à mes fins.



            -
            Edité par sirius911 19 mars 2015 à 11:47:49

            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              20 mars 2015 à 16:45:18

              ici tu as une class qui en appelle une autre.

              :/

              c'est un probleme de conception, et python te le dit a sa maniere, il ne peut pas (et ne veut surement pas) faire d'import circulaire !

              tu peux surement faire autrement, genre, je sais pas moi !

              un monteur, ou bien une fabrique !

              ou tout simplement un heritage tout con ;) (m'enfin a ne dois pas heriter de b si b herite deja de a :) )

              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                20 mars 2015 à 19:39:01

                Nomme tes modules en minuscule, et trouve des noms évident, pas juste une lettre qui ne veut rien dire ! Comme le dit Lubzorg, renseigne-toi sur l'héritage. Je pense que ton souci de conception vient de là, mais comme j'ai rien compris à ce que tu veux faire, difficile de t'aider d'avantage... :(

                • Partager sur Facebook
                • Partager sur Twitter
                  20 mars 2015 à 23:29:49

                  D'une façon générale, si tu as deux morceaux de code interdépendants (fonctions mutuellement récursives ou autre), ils n'ont rien à faire dans des modules différents. Essaye d'organiser tes modules par niveaux de dépendance ou d'abstraction : qui a besoin de qui ? Qui délègue le boulot à qui ?

                  Les modules de plus bas niveau sont ceux qui n'ont pas besoin des autres pour fonctionner, et qui devraient limite être réutilisables dans d'autres programmes.

                  -
                  Edité par nohar 20 mars 2015 à 23:30:32

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Zeste de Savoir, le site qui en a dans le citron !
                    25 mars 2015 à 23:09:25

                    Merci les amis

                    Pour l'instant en mes "import" de la forme : 

                    import general.a  etc... fonctionnent très bien

                    Je suis consciente Celthon que mes explications ne soient pas claires :p !!

                    Pourtant j'ai essayé de simplifier au maximum

                    J'ai une entité vivante(appelé CoCiX) représentée par différents objets complexes dont un objet Place qui représente un emplacement dans un environnement.

                    Cet Objet Place est composé de coordonnées, d'une dizaine d'attributs ( température, radioactivité, humidité etc...) et d'une cinquantaine de fonctions permettant d'interagir avec cet environnement (prendre de l'eau sur cette case, mettre des nutriments, reconnaitre de phéromones etc...) plusieurs de ces fonctions doivent créer pour leur besoin propre des objets CoCiX pour faire des interactions entre les différentes entités.

                    J'ai déjà programmé cet modélisation sous C++, Java et sous PHP et je n'ai eu aucun problème.

                    Là, ce qui m'intéresse c'est de faire fonctionner en Python ce qui a pour le moment simplifier le code.

                    Merci

                    • Partager sur Facebook
                    • Partager sur Twitter

                    problème import

                    × 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