Partage
  • Partager sur Facebook
  • Partager sur Twitter

classe et retour d'input avec modules

Sujet résolu
    6 janvier 2022 à 17:20:39

    Bonjour,

    Désolé, je reviens vous embêter, pour la suite du sujet 'classe et retour d'input'... En fait je bloque sur la suite de mon problème, quand je passe par plusieurs modules, en ayant une variable('name') récupérant l'input présent dans une classe dans un des modules, elle se lance automatiquement dès le début, mais ne devrait pas.

    J'ai 3 modules, un main qui appelle module1 et module2. 

    main :

    import module1, module2
    
    def main():
        print("bonjour main !")
        module1
        module2
    
    
    if __name__ == "__main__":
        main()
    

    module1 :

    class ClassTest:
        def __init__(self, input_test=""):
            self.input_test = input_test
    
    def test1(u):
        print(f"{u} test1")
    
    def test2(o):
        print(f"{o} test2")
    
    print("bonjour module1 !")
    class_test = ClassTest(input("?"))
    name = class_test.input_test
    
    test1(name)
    test2(name)

    module2 :

    from module1 import name
    
    def test3(u):
        print(f"{u} test3")
    
    def test4(o):
        print(f"{o} test4")
    
    print("bonjour module2 !")
    test3(name)
    test4(name)
    

    Et donc ça devrait(enfin ça aurait du...) afficher en premier "bonjour main !". Comment contourner le problème s'il vous plaît ?

    -
    Edité par DamienZeh 6 janvier 2022 à 17:21:29

    • Partager sur Facebook
    • Partager sur Twitter
      6 janvier 2022 à 17:34:26

      tu aurais dû le mettre à la suite de ton autre sujet; ça reste la même problématique.
      Quand tu importes module1 dans main, les lignes 11 à 16 de module1 vont s'exécuter puisqu'elles ne sont pas dans une fonction (ou un bloc)
      • Partager sur Facebook
      • Partager sur Twitter
        6 janvier 2022 à 17:46:45

        Désolé, je croyais avoir fini ce post, mais j'ai été bloqué en attaquant la gestion des modules. Et c'est que sinon je dois attendre 24h pour pouvoir reposter un message...

        Je comprends qu'il lise le code du module1 quand je l'appelle, mais pourquoi il n'affiche pas d'abord le print du main ?

        Et si jamais je mets cette variable en fonction, comme ceci :

        def name():
            class_test = ClassTest(input("?"))
            name = class_test.input_test
            return name

        cela n'aurait plus l'effet de stocker l'input, il le redemandera à chaque appel...

        -
        Edité par DamienZeh 6 janvier 2022 à 17:47:23

        • Partager sur Facebook
        • Partager sur Twitter
          6 janvier 2022 à 18:02:29

          Au pire, tu peux éditer le message précédent si tu as la contrainte d'attente de 24h.

          je le redis, parce module1 est lu quand tu fais l'import (import module1).

          donc ton import module1, module2 fait que tu exécutes les lignes 11 à 16 du module1 puis les lignes 9 à 11 du module2 (les autres lignes étants des définition de fonctions, elles ne sont appelés que si elles sont utilisées, ce qui est le cas ici aussi) et ensuite les instructions du main

          Si tu ne veux pas que les instructions de tes modules soient exécutées, il faut rajouter un bloc if __name__=="__main__": 

          • Partager sur Facebook
          • Partager sur Twitter
            6 janvier 2022 à 18:28:43

            Oui, je n'y avais pas pensé sur le moment, désolé.

            Donc si je comprends bien, par exemple dans module1, tout en haut je fais un 'if __name__ == "__main__":' et en dessous, j'indente le code? Car si je fais ça, je n'ai plus accès à ma variable 'name' dans le module2.

            -
            Edité par DamienZeh 6 janvier 2022 à 18:29:02

            • Partager sur Facebook
            • Partager sur Twitter
              6 janvier 2022 à 19:00:00

              Non pas tout en haut, mais au niveau des instructions que tu ne veux pas exécutés (sauf si tu lances directement le script du module).
              Dans ton cas, il y une "obligation" que name soit créé et accessible; donc

              module1

              class ClassTest:
                  def __init__(self, input_test=""):
                      self.input_test = input_test
               
              def test1(u):
                  print(f"{u} test1")
               
              def test2(o):
                  print(f"{o} test2")
               
              class_test = ClassTest(input("?"))
              name = class_test.input_test
              #que l'on peut avantageusement remplacer par la seule ligne
              #name=ClassText(input("?)).input_test
              #et qui revient au finale à
              #name=input("?")
              def main():
                  print("bonjour module1 !")
                  
                  test1(name)
                  test2(name)
              
              if __name__=="__main__":
                  main()

              module2:

              from module1 import name
               
              def test3(u):
                  print(f"{u} test3")
               
              def test4(o):
                  print(f"{o} test4")
              
              def main():
                  print("bonjour module2 !")
                  test3(name)
                  test4(name)
              
              if __name__=="__main__":
                  main()
              


              et main:

              import module1, module2
               
              def main():
                  print("bonjour main !")
                  name=module1.name
                  module1.main()
                  module2.main()
               
              if __name__ == "__main__":
                  main()

              je n'ai pas testé, mais ça devrait faire ce que tu attends je pense.

              • Partager sur Facebook
              • Partager sur Twitter
                6 janvier 2022 à 19:09:27

                Ok merci, je m'y perdais un peu dans les tutos sur ce 'if __name__ == "__main__":'

                En faisant ainsi, ça déroule tout le code, mais ça commence quand même par demander l'input, au lieu d'afficher 'bonjour main!' en premier.

                -
                Edité par DamienZeh 6 janvier 2022 à 19:10:04

                • Partager sur Facebook
                • Partager sur Twitter
                  6 janvier 2022 à 19:23:32

                  C'est logique si tu as compris mes explications et mon code.

                  Sinon, il faut déplacer les lignes 11 et 12 du module1 dans son main et, dans le fichier main.py, appeler module1.main() avant de pouvoir accéder à module1.name 

                  • Partager sur Facebook
                  • Partager sur Twitter
                    7 janvier 2022 à 7:34:40

                    Pardon, mais je suis vraiment largué la... J'ai essayé toute la soirée.:(

                    Comment le module2 peut accéder au name de module1 puisqu'il est dans une fonction maintenant(le main) ?

                    N'y aurait-il pas moyen de faire plus simple en mettant cette variable dans une classe ?

                    J'essaie de faire une classe qui fait un append du retour de l'input dans une liste, puis de la récupérer, pour l'instant sans succès, je ne sais pas si on peut procéder ainsi...

                    -
                    Edité par DamienZeh 7 janvier 2022 à 11:32:29

                    • Partager sur Facebook
                    • Partager sur Twitter
                      7 janvier 2022 à 13:14:49

                      j'avais zappé ça, mais comme on fait dans le main.py, import du module1 et lancement du module1.main(). Mais du fait que name ne soit présent que dans le main() du module2, il faut la déclarer en global dans ce main.

                      En bricolant: module1

                      class ClassTest:
                          def __init__(self, input_test=""):
                              self.input_test = input_test
                        
                      def test1(u):
                          print(f"{u} test1")
                        
                      def test2(o):
                          print(f"{o} test2")
                      
                      def main():
                          global name
                          print("bonjour module1 !")
                          class_test = ClassTest(input("?"))
                          name = class_test.input_test 
                          test1(name)
                          test2(name)
                       
                      if __name__=="__main__":
                          main()
                      

                      module2:

                      import module1
                        
                      def test3(u):
                          print(f"{u} test3")
                        
                      def test4(o):
                          print(f"{o} test4")
                       
                      def main(name=""):
                          print("bonjour module2 !")
                          test3(name)
                          test4(name)
                       
                      if __name__=="__main__":
                          module1.main()
                          main(module1.name)
                      

                      main:

                      import module1, module2
                        
                      def main():
                          print("bonjour main !")
                          module1.main()
                          name=module1.name
                          module2.main(name)
                        
                      if __name__ == "__main__":
                          main()
                      





                      • Partager sur Facebook
                      • Partager sur Twitter
                        7 janvier 2022 à 14:35:07

                        houawou, ok je vois, ça marche super. Merci beaucoup.

                        Maintenant il va falloir que je fasse ça sur mon programme, qui est bien chargé, ça va être coton, mais formateur.:)

                        En tout cas merci, je vois maintenant comment cela fonctionne, c'est bien plus clair.

                        • Partager sur Facebook
                        • Partager sur Twitter

                        classe et retour d'input avec modules

                        × 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