Partage
  • Partager sur Facebook
  • Partager sur Twitter

Empêcher l'exéc. d'1 fct avec param lors de déf

    4 décembre 2023 à 21:16:30

    Bonjour,

     Je rejoins une peu la question de https://openclassrooms.com/fr/members/q8nhpm74p786

    https://openclassrooms.com/forum/sujet/empecher-l-execution-d-une-fonction-lors-de-sa-def

    à quelque chose près : des paramètres.

    def recovering_data(*args):
         # Suite du code

    J'aimerais éviter que le code de cette fonction ne s'exécute pas lorsque l'on importe le fichier où elle se trouve.

    -
    Edité par MichelMARTIN7 4 décembre 2023 à 21:17:44

    • Partager sur Facebook
    • Partager sur Twitter
      4 décembre 2023 à 21:35:06

      La fonction ne s'exécute que si on l'appelle, je ne comprend pas ta question...
      • Partager sur Facebook
      • Partager sur Twitter

      Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
      La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

        5 décembre 2023 à 8:06:27

        Salut,

        Comme le dit @fred1599, c'est qu'elle est appelée dans ton fichier.

        Exemple :

        def recovering_data(*args):
             # Suite du code
        #
        #
        #
        #
        #
        #
        
        recovering_data([arg1, arg2, arg3])

        Pour éviter que lors d'un import la fonction s'éxecute on utilise une condition:

        def recovering_data(*args):
             # Suite du code
        #
        #
        #
        #
        #
        #
        
        if __name__ == "__main__":
            recovering_data([arg1, arg2, arg3])




        • Partager sur Facebook
        • Partager sur Twitter
          5 décembre 2023 à 8:56:56

          Merci pour ta réponse Fred, ce n'est pas mon projet mais l'on m'a chargé de me mettre dessus.

          J'exécute un main.py avec un paramètre.

          Dans le main : l'appel à recovering_data() se fait.

          Cette fonction est connue par un import.

          Par contre, que ce soit en debug ou avec des traces : je vois que cette fonction est exécutée avant le main, un peu comme si elle l'était via l'import.

          Si j'écris ici, c'est qu'il y a un mécanisme qui m'échappe.

          • Partager sur Facebook
          • Partager sur Twitter
            5 décembre 2023 à 9:03:03

            Peux tu montrer une partie de ton code où tu as le problème.

            Même si tu importes la fonction, tant qu'elle n'est pas appelée, la fonction ne sera pas exécutée. Et si tu l'exécutes, c'est que tu l'appelles et que ça ne peut être que ta décision de le faire ou pas.

            C'est donc toujours pas plus clair... le code aidera à comprendre je pense.

            • Partager sur Facebook
            • Partager sur Twitter

            Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
            La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

              5 décembre 2023 à 9:38:34

              C'est cette situation-là ?

              Le code principal

              import mon_module
              
              print ("C'est parti")
              
              

              qui fait des trucs qu'on lui a pas demandé

              $ python3 main.py 
              ma_fonction() est appelée
              C'est parti
              

              parce que dans  mon_module.py

              def ma_fonction():
                  print ("ma_fonction() est appelée")
              
              ma_fonction()       # appel
              
              

              il y a un appel à la fonction.

              Autrement dit, le module en question ne fait pas QUE définir des fonctions, il exécute du code aussi.

              Comment l'en empêcher ? modifier le code du module. Et pour ça, lire et analyser son code. Read the source, Luke.

              Question : que viennent faire les paramètres là-dedans ?

              -
              Edité par michelbillaud 5 décembre 2023 à 10:27:32

              • Partager sur Facebook
              • Partager sur Twitter
                5 décembre 2023 à 9:53:51

                MichelMARTIN7 a écrit:

                Si j'écris ici, c'est qu'il y a un mécanisme qui m'échappe.


                Moi je ne vois pas comment vous pouvez affirmer "je vois que cette fonction est exécutée avant le main, un peu comme si elle l'était via l'import" sans avoir l'idée de le vérifier.

                C'est pas si compliqué de lancer l'interpréteur python pour y taper "import module" et voir ce qu'il se passe. Pour le reste, s'il ne vous est pas possible de lire le code pour trouver où la fonction est appelée, sauf à poster le code, on ne peut rien pour vous.

                • Partager sur Facebook
                • Partager sur Twitter
                  5 décembre 2023 à 9:58:48

                  Le début du main :

                  from pytictoc import TicToc
                  from utils import stock_data_loader as SDL
                  from utils.gauge_arg import gauge_arg
                  
                  
                  def main():
                      t = TicToc()
                      t.tic()  # Start timer
                  
                      # Get and fix the gauge parameter
                      import sys
                      args = sys.argv[1:]
                      if len(args) == 2 and args[0] == '-gauge':
                          gauge_arg.value = int(args[1])
                      print(f'Gauge value in main ---> {gauge_arg.value}')
                  
                      date = [2023, 6, 30, 0, 0, 0]
                      print('Loading stock data...')
                      stock_data = SDL.convertSTRUCTtoDF(SDL.recovering_data(), date)
                      print('Stock data loaded\n')


                  Dans la fonction recovering_data(), j'ai ajouté une ligne au tout début :

                  print(f'Value in recovering_data ---> {gauge_arg.value}')

                  Dans ses imports :

                  import numpy as np
                  import pandas as pd
                  from utils.gauge_arg import gauge_arg


                  Le code de recovering_data() ne donnerais de plus (il récupère des données dans de fichiers via ftp...)

                  Sur la console :

                  Value in recovering_data ---> -1
                  Value in main ---> 0
                  Loading debris data...
                  Value in recovering_data ---> 0
                  Debris data loaded
                  

                  La fonction recovering_data() est appelée deux fois, quelle pourrait-être la cause de ce premier appel ?

                  EDIT :

                  HAHAAAAAA... je suis complètement désolé.

                  J'ai suivi l'idée de mps, de faire des imports dans une console Python et... je dois avouer que j'ai honte.

                  Il un :

                  if __name__ == '__main__':

                  dans un fichier importé

                  avec une fonction qui me pourri les temps de traitement :

                  def print_stock_matrix(stock_matrix=stock_matrix_generation(SDL.convertSTRUCTtoDF(SDL.recovering_data()))):

                  Cela sent le debug d'un développeur... :o

                  Je suis navré de vous avoir fait perdre votre temps, en tout cas merci pour votre réactivité.

                  -
                  Edité par MichelMARTIN7 5 décembre 2023 à 10:19:58

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Empêcher l'exéc. d'1 fct avec param lors de déf

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  • Editeur
                  • Markdown