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 :

appel de fonction multiple


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    491
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 491
    Par défaut appel de fonction multiple
    Bonjour,

    J'ai une fonction principale qui appelle d'autres fonctions en fonction d'un attribut ID. mon code ressemble à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def fonctionPrincipale(id):
        if id == 1: autreFonction_1()
        elif id == 2: autreFonction_2()
        elif id == 3: autreFonction_3()
        else: print('erreur sur id')

    Les noms de mes fonctions appelées sont tous de la forme : un préfixe suivi de l'id.
    Le problème, c'est que id peut prendre des valeurs de 1 à 400, et je me vois pas écrire 400 elif dans ma fonction principale.

    Est-ce qu'il y a une façon de simplifier en écrivant quelquechose du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def fonctionPrincipale(id):
        if id < 400: autreFonction_[id]()
        else: print('erreur sur id')
    Merci,
    Nico

  2. #2
    Membre expérimenté Avatar de zancrows
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2016
    Messages : 159
    Par défaut
    Salut, tu peux faire ce que tu souhaites en passant par un dictionnaire:

    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    # coding: utf-8
     
    def func_1():
        print("function 1")
     
    def func_2():
        print("function 2")
     
    def func_3():
        print("function 3")
     
    def fonction_principale(id):
        d = {
            1: func_1,
            2: func_2,
            3: func_3
        }
        d.get(id, lambda: print("erreur id"))()
     
     
    fonction_principale(1)
    fonction_principale(42)

  3. #3
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Passer par un dictionnaire comme celui là va quand même l'obligé à écrire ce dictionnaire de 400 lignes !
    Autant passer par un dictionnaire qui contient déjà cet info : le dictionnaire globals()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def f1():
    	return 1
     
    def f2():
    	return 2
     
    def f3():
    	return 3
     
    def f(id):
    	return globals()["f%d"%id]()
     
    print(f(3))

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 748
    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 748
    Par défaut
    Salut,

    Citation Envoyé par DiverSIG Voir le message
    Est-ce qu'il y a une façon de simplifier en écrivant quelquechose du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def fonctionPrincipale(id):
        if id < 400: autreFonction_[id]()
        else: print('erreur sur id')
    Si autreFonction_ est la liste des fonctions à appeler [ fonction_1, fonction_2, fonction_3 ], çà va marcher à condition de décrémenter id (puisque le premier élément d'une liste à pour index 0).

    On peut faire aussi cela par "introspection".
    D'abord on pousse l'ensemble des fonctions dans une "class" ou un "module" que j'appellerai X. Puis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
           if hasattr(X, f'autreFonction_{id}'):
              getattr(X, f'autreFonction_{id}')()
    ou:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
              if (f:  getattr(X, f'autreFonction_{id}', None)):     
                 f()
    Citation Envoyé par lg_53 Voir le message
    Autant passer par un dictionnaire qui contient déjà cet info : le dictionnaire globals()
    Ca marche mais 400 fonctions (déjà la fatigue de les écrire mais bon...) c'est typiquement 400 noms qui vont polluer le dictionnaire globals(). Ce qu'on pallie avec class ou module.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par DiverSIG Voir le message
    Le problème, c'est que id peut prendre des valeurs de 1 à 400, et je me vois pas écrire 400 elif dans ma fonction principale.

    Est-ce qu'il y a une façon de simplifier en écrivant quelquechose du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def fonctionPrincipale(id):
        if id < 400: autreFonction_[id]()
        else: print('erreur sur id')
    C'est un petit peu à ça que servent les tableaux. A éviter de coder 400 lignes différentes pour les remplacer par une seule ligne contenant le nom du tableau et un indice permettant de ciblier un élément particulier.
    Et en Python on peut parfaitement avoir des tableaux de fonctions...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    def fonctionPrincipale(id):
        try:
            eval(f'autreFonction_{id}')()
        except:
            print('erreur sur id')
    ?

  7. #7
    Invité
    Invité(e)
    Par défaut
    400 fonctions

  8. #8
    Membre éclairé

    Inscrit en
    Novembre 2008
    Messages
    424
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 424
    Par défaut
    Citation Envoyé par LeNarvalo Voir le message
    400 fonctions
    C'est vrai que c'est étrange d'avoir une fonction par id...

    Ces 400 fonctions sont-elles significativement différentes ou ne serait-il pas possible de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    def ma_fonction(id):
        return id*4 # Juste un exemple...

Discussions similaires

  1. Problème appel de fonction multiple
    Par Nicopeuzin dans le forum Android
    Réponses: 0
    Dernier message: 03/04/2017, 14h48
  2. Réponses: 4
    Dernier message: 19/04/2004, 13h41
  3. [JSP] Appeler une fonction
    Par Patrick95 dans le forum Servlets/JSP
    Réponses: 10
    Dernier message: 23/12/2003, 13h44
  4. Appel à des fonctions incluses dans des DLL
    Par Greybird dans le forum Langage
    Réponses: 3
    Dernier message: 26/05/2003, 13h33
  5. Appeler une fonction avec/sans parenthèses
    Par haypo dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 29/12/2002, 18h48

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