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 :

Appeler une fonction grace à une variable


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Inscrit en
    Septembre 2008
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 2
    Par défaut Appeler une fonction grace à une variable
    Bonjour,
    Je cherche un moyen d'appeler une fonction avec une variable.
    Que le nom de la fonction soit la variable.
    exemple : si la variable "a" contient toto, en fessant a() ceci exécutera la fonction toto()

    j'ai créé un petit programme :
    Il ne fonctionne pas car au moment de remplacer la variable par ce qu'elle contient et donc appeler la fonction, ca me renvoi une erreur comme quoi l'exécuteur ne connaît pas «a()».

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    #!/usr/bin/python
    # -*- coding:Utf-8 -*-   
     
     
     
    def menu():								
     
    	print"----------------Menu principal-------------------------------"
     
    	a=raw_input(">veuillez entrer le numéro de l'exercice à exécuter:" "\nPar exemple 'ex2_2' pour l' ex2.2: ", )
     
    	global a 
     
     
     
    def ex2_2():									
    	a=input("veuiller entrer le nombre à mettre au carré:", )
     
    	b=a*a
     
    	print "le résultat de",a,"au carré est:",b
     
    	a=raw_input("\nAppuyer sur une touche pour revenir au menu général", )
     
    	menu()
     
    def ex2_3():
    	print "voici l'exercice 2.3"
     
     
     
    def sortie():									
    	a=raw_input("Voulez vous vraiment quitter ce programme? oui ou non: ", )
     
    	if (a == "oui") :
     
     		print"merci! au revoir."
     
    		exit()
     
    	elif (a == "non") :
     
    		menu()	
     
    	else :
     
    		print">>>Erreur, taper 'oui' pour quitter le programme ou 'non' pour revenir au menu principal!"
     
    		sortie()
     
     
     
    def gestion_de_la_fonction(m):					
    	print"execution du programme:", m
     
    	m()							
     
     
    #ici début du programme
     
    menu()
     
    print "la var a est:",a
     
    print "le programme s'execute:\n" , gestion_de_la_fonction(a)
    L'erreur que j'ai en retour est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     File "./pytho", line 29, in gestion_de_la_fonction
        m()						
    TypeError: 'str' object is not callable
    Auriez vous une idée pour faire fonctionner ce programme avec une variable pour appeler une fonction?
    Je pourrais aussi utiliser des «if» pour sélectionner la fonction, mais il y aurait autant de if que de fonctions à exécuter.
    Merci de votre aide.

  2. #2
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 8
    Par défaut
    La fonction raw_input() retourne une chaîne: c'est au programmeur de vérifier qu'elle correspond à une fonction. Il y a plusieurs solutions, par exemple en regardant dans le dictionnaire globals() qui contient le nom des variables globales:

    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
     
    def erreur():
    	print "--- Erreur dans le choix de l'exercice! ---"
     
    def menu():								
     
    	print"----------------Menu principal-------------------------------"
     
    	a=raw_input(">veuillez entrer le numéro de l'exercice à exécuter:" "\nPar exemple 'ex2_2' pour l' ex2.2: ", )
     
    	fonction_menu = erreur	 ## en cas de problème 
    	if a not in globals():
    		print "--- Exercice '%s' inconu" % a
    	else:
    		valeur = globals()[a]
    		if not callable(valeur):
    			print "--- Le nom d'exercice '%s' ne correspond pas à une fonction" % a
    		else:
    			fonction_menu = valeur
    	return fonction_menu
     
    fonction = menu()
    fonction() # -- exécutera la fonction choisie ...
    La bibliothèque standard contient un module standard cmd.py qui offre une solution plus structurée.

    Bonne chance !

  3. #3
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut
    Salut,
    avec Python, tout est objet, y compris les fonctions.

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    #!/usr/bin/env python
    #coding=utf-8
     
    def menu():								
    	print"----------------Menu principal-------------------------------"
    	a=raw_input(">veuillez entrer le numéro de l'exercice à exécuter:" "\nPar exemple 'ex2_2' pour l' ex2.2: ", )
    	return a 
     
    def ex2_2():									
    	a=input("veuiller entrer le nombre à mettre au carré:", )
    	b=a*a
    	print "le résultat de",a,"au carré est:",b
    	a=raw_input("\nAppuyer sur une touche pour revenir au menu général", )
    	menu()
     
    def ex2_3():
    	print "voici l'exercice 2.3"
     
    def sortie():									
    	a=raw_input("Voulez vous vraiment quitter ce programme? oui ou non: ", )
    	if (a == "oui") :
     		print"merci! au revoir."
    		exit()
    	elif (a == "non") :
    		menu()	
    	else :
    		print">>>Erreur, taper 'oui' pour quitter le programme ou 'non' pour revenir au menu principal!"
    		sortie()
     
    def gestion_de_la_fonction(m):					
    	print"execution du programme:", m
    	listeFonc[m]()							
     
     
    #ici début du programme
    listeFonc={}
    listeFonc['ex2_2']=ex2_2
    listeFonc['ex2_3']=ex2_3
     
    while True:
        a=menu()
        print "la var a est:",a
        print "le programme s'execute:\n"
        gestion_de_la_fonction(a)

  4. #4
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 8
    Par défaut
    Puisque j'en ai parlé, voici un exemple avec cmd.py:

    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
    #!/usr/bin/env python
    #coding=utf-8
     
    from cmd import Cmd
     
    class Exercices(Cmd):
      def do_ex2_2(self, arg):
        """Exercice 2.2: élève au carré un entier"""
        try:
          int_arg = int(arg)
        except ValueError, iExc:
          print "L'argument %r n'est pas un nombre entier" % arg
        else:
          print " %d au carré = %d" % (int_arg, int_arg*int_arg)
      def do_ex2_3(self, arg):
        """Exercice 2.3: ... """
        print "exécutions de ex3 avec arg=%r" % arg
      def do_quit(self, arg):
        """Quitter"""
        return 1
     
    iMM = Exercices()
    iMM.cmdloop()
    On peut utiliser ? pour obtenir de l'aide, et utiliser des commandes comme:
    ex2_2 21

    A complèter et améliorer ...

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    J'ai cherché (pas très fort) la solution sans trouver celle qu'apporte rambc, et que je crois la seule possible.
    Mais les modifications apportées par rambc pour permettre au code de tourner en boucle n'ont pas changé le vice de fabrication suivant:

    La fonction menu() dans la fonction ex2_2() renvoie le numéro de l'exercice à exécuter mais celui-ci n'est pris en charge par aucune variable, donc le programme sort de la fonction ex2_2() pour se retrouver dans la fonction gestion_de_la_fonction(ex2_2) : là le programme se retrouve après la dernière ligne, n'a rien à faire et sort donc de la fonction gestion_de_la_fonction(ex2_2).
    Il se retrouve après la dernière ligne de la boucle while True et repart donc sur sa première ligne, c'est à dire menu()...
    Le passage dans la fonction menu() au sein de la fonction ex2_2() est donc sans utilité.
    À vrai dire, ce sont les 2 dernières lignes de la fonction ex2_2() qui sont sans utilité.


    Autre problème:
    à quel moment la fonction sortie() est-elle appelée, à part à l'intérieur d'elle même ?

    Je propose le code suivant dans lequel je fais disparaître la fonction menu() en l'intégrant dans le message de raw_input().

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    #!/usr/bin/env python
    #coding=utf-8
     
    def ex2_2():
        a = input("veuiller entrer le nombre à mettre au carré:" )
        print "le résultat de",a,"au carré est:",a*a
    def ex2_3():
        print "voici l'exercice 2.3"
    def sortie():
        a=raw_input("Voulez vous vraiment quitter ce programme? oui ou non: ", )
        if a == "oui":
            print"merci! au revoir."
            exit()
        elif a == "non":
            pass	
        else :
            print">>>Erreur, taper 'oui' pour quitter le programme ou 'non' pour revenir au menu principal!"
            sortie()
    def gestion_de_la_fonction(m):
        if m in listeFonc:
            print"execution du programme:", m
            listeFonc[m]()
        elif m=='quit':
            sortie()
        else:
            print "Je ne comprends pas ce que vous avez tapé. recommencez"
     
    #ici début du programme
    listeFonc={'ex2_2':ex2_2,'ex2_3':ex2_3}
     
    mess = """----------------Menu principal-------------------------------
    >veuillez entrer le numéro de l'exercice à exécuter:\
    \nPar exemple 'ex2_2' pour l' ex2.2: """
     
    while True:
        gestion_de_la_fonction(raw_input(mess))
    Au passage, petite question:
    dans la définition de mess, pourquoi suis-je obligé d'écrire un '\n' devant 'Par exemple 'ex2_2' pour l' ex2.2:' et pas devant la ligne précédente pour obtenir un retour à la ligne effectif ?

  6. #6
    Membre Expert Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Par défaut
    Citation Envoyé par eyquem Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    mess = """----------------Menu principal-------------------------------
    >veuillez entrer le numéro de l'exercice à exécuter:\
    \nPar exemple 'ex2_2' pour l' ex2.2: """
    Au passage, petite question:
    dans la définition de mess, pourquoi suis-je obligé d'écrire un '\n' devant 'Par exemple 'ex2_2' pour l' ex2.2:' et pas devant la ligne précédente pour obtenir un retour à la ligne effectif ?
    A cause du \ à la fin de la ligne 2, tu peux remplacer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mess = """----------------Menu principal-------------------------------
    >veuillez entrer le numéro de l'exercice à exécuter:
    Par exemple 'ex2_2' pour l' ex2.2: """

  7. #7
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut
    Bien vu eyquem. Etant donné l'heure tardive à laquelle j'ai modifié le listing, j'ai juste voulu montrer l'utilisation d'un dctionnaire avec des fonctions pour valeurs.

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Merci pacificator. En fait ce matin j'ai revu ça et j'ai fini par trouver ce que tu indiques. J'ai confondu l'écriture d'une chaine """ch""" avec les instructions écrites sur plusieurs lignes. C'est étonnant comme on peut ne pas voir l'évidence parfois, parce qu'on reste en réalité persuadé que ce qu'on a écrit est juste.

Discussions similaires

  1. Appel d'une fonction dans une fonction d'une même classe
    Par script73 dans le forum Général Python
    Réponses: 3
    Dernier message: 06/03/2015, 10h18
  2. Réponses: 9
    Dernier message: 08/07/2009, 17h10
  3. Appeler une fonction dans une fonction
    Par bryanstaubin dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 18/06/2007, 09h39
  4. Retour d'une chaine grace à une fonction
    Par K0mpu73rn1kDaCS dans le forum MFC
    Réponses: 6
    Dernier message: 27/01/2006, 00h18
  5. Réponses: 4
    Dernier message: 17/03/2004, 17h24

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