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

  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 : 46
    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.

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 99
    Par défaut
    La première solution proposée par try2Bpro avait quand même l'élégance d'être générique et de ne pas avoir besoin de modifications de code pour ajouter d'autres exercices.

    J'aurais naturellement tendu vers une solution similaire plutôt que celle du dictionnaire qui n'apporte rien au programme si ce n'est qu'on doive ce taper le boulot a la main (la création du dico).

  10. #10
    Candidat au Club
    Inscrit en
    Septembre 2008
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 2
    Par défaut suite
    Merci, voila le programme :

    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
    #!/usr/bin/python
    # coding:Utf-8 
     
    def td2_2():									#exemple d'un TD à executer
    	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 td2_3():
    	a=input("donner le prix ht d'un article:", )
    	b=input("donner le nombre d'article:", )
    	c=input("donner le taux de tva:", )
    	g=a*b
    	h=g*(c/100)
    	j=g+h
    	print">vous avez entrer",b,"article(s) à",a,"euros ht chacun"
    	print">le total HT fait donc:",g,"euros"
    	print">la tva etant de:",c,"%, le total de vos achats vous couterons:",j,"euros"
    	print"------------RESUME---------------------"
    	print"-nombre d'article(s):",b
    	print"-prix d'un article:",a
    	print"-total HT:",g
    	print"-la tva est a:",c,"%"
    	print"-le total TTC est de:",j,"euros"
    	a=raw_input("\nAppuyer sur une touche pour revenir au menu général", )
    	menu()
     
    def sortie():									#fonction de sortie du programme
    	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()
     
    #ici début du programme
    def erreur():
    	print "--- Erreur dans le choix de l'exercice! ---"
    	a=raw_input("\nAppuyer sur une touche pour revenir au menu général", )
    	menu()
     
    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.\nOu bien 'sortie' pour quitter ce programme: ", )
     	fonction_menu = erreur	 ## en cas de problème 
    #le dictionnaire globals() contient le nom des variables globales et donc les noms des fonctions déclarées dans ce script
    	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 ...
    Le problème est qu'après avoir exécuté une fonction, je suis redirigé vers le menu() pour exécuter un autre exercice. Lorsque je tape entrer le programme se termine!

    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
    guillaume@guillaume-laptop:/media/data/python$ ./pytho
     
    ----------------Menu principal-------------------------------
     
    >veuillez entrer le numéro de l'exercice à exécuter: 
     
    Par exemple 'ex2_2' pour l' ex2.2.
     
    Ou bien 'sortie' pour quitter ce programme: td2_2
     
    veuiller entrer le nombre à mettre au carré:3
     
    le résultat de 3 au carré est: 9
     
     
     
    Appuyer sur une touche pour revenir au menu général
     
    ----------------Menu principal-------------------------------
     
    >veuillez entrer le numéro de l'exercice à exécuter: 
     
    Par exemple 'ex2_2' pour l' ex2.2.
     
    Ou bien 'sortie' pour quitter ce programme: td2_3
     
    guillaume@guillaume-laptop:/media/data/python$ 
    guillaume@guillaume-laptop:/media/data/python$
    guillaume@guillaume-laptop:/media/data/python$
    Comment faire pour que
    "fonction = menu()
    fonction() # -- exécutera la fonction choisie ..."
    S'applique à nouveau?
    A part le copier-coller plusieurs fois à la fin du script.

  11. #11
    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 Suggestions ...
    Il me semble judicieux de séparer le niveau "menu" du niveau des exercices ! L'appel de menu() à la fin de chaque exercice est trompeur, car le prompt est affiché, mais le choix n'est pas exécuté!

    Remarque: si on corrige menu() pour qu'il exécute aussi la fonction choisie, on provoque un appel récursif de menu() qui mange peu à peu la mémoire (mais Python le supporte bien!). Le pire étant que l'on ne maîtrise plus la logique d'exécution!

    Modifications proposées:
    ------------------------

    1) Supprimer les appels à "menu()" à la fin de chaque exercice

    2) Modifier la méthode sortie() comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    def sortie():		# fonction de sortie du programme
    	while 1:
    		a=raw_input("Voulez vous vraiment quitter ce programme? oui ou non: ", )
    		if (a == "oui") :
    	 		print"merci! au revoir."
    			exit()
    		elif (a == "non") :
    			break
    		else :
    			print">>>Erreur, taper 'oui' pour quitter le programme ou 'non' pour revenir au menu principal!"
    3) Ajouter à la fin du module une méthode main() utilisable comme auparavant menu(), et l'idiome classique de Python qui permet d'utiliser le module directement depuis la ligne de commande.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    def main():
    	while 1:
    		fonction = menu()
    		fonction() # -- exécutera la fonction choisie ...
     
    if __name__ == "__main__":
    	main()
    4) Améliorations suggérées: modifier le texte affiché dans menu(), mettre la question "a=raw_input("\nAppuyer ..." dans la fonction main() (si elle est vraiment nécessaire)

  12. #12
    Membre Expert
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Par défaut
    NON ET NON ET NON !!!!

    Vous voyez pas les problème énormes de logique là ??

    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
     
    def td2_2():
        menu()
     
    def td2_3():
        menu()
     
    def sortie():
        if (a == "oui") :
            exit()
        elif (a == "non") :
            menu()  
        else :
            sortie()
     
    def erreur():
        menu()
     
    def menu():
        appel de menu, td2_2, td2_3, sortie, erreur suivant l'envie de l'utilisateur !!
    N'importe quelle fonction appelle n'importe qui, sans parler qu'on en rajoute une couche en exécutant une fonction après la saisie par raw_input qui peut appeler n'importe quoi.

    ----------------------------------------------------------------------

    Bon maintenant que j'ai fini de sauter au plafond !!

    1) une seule boucle qui contrôle l'ensemble du programme
    2) les exos sont TOUS nommées 'exo_'<quelque chose>, l'utilisateur tape juste la partie 'quelque chose' et l'on rajoute 'exo_' avant. comme ca on controle qu'il ne peut lancer que les fonctions 'exo', ca évite aussi le gros problème de l'exemple précédent, ou l'utilisateur peut taper "menu" dans le choix et ne pas avoir d'erreur vu que la fonction menu existe.

    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
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    def exo_td2_2():
        print 'td2_2'
     
    def exo_td2_3():
        print 'td2_3'
     
    def confirm_sortie():
        while True:
            a=raw_input("Voulez vous vraiment quitter ce programme? oui ou non: ", )
            if (a == "oui") :
                print"merci! au revoir."
                return True
            elif (a == "non") :
                return False
            else :
                print">>>Erreur, taper 'oui' pour quitter le programme ou 'non' pour revenir au menu principal!"
     
    def main():
        fin = False
        while not fin:
            print
            print"----------------Menu principal-------------------------------"
            a=raw_input(">veuillez entrer le numéro de l'exercice à exécuter: \nPar exemple 'ex2_2' pour l' ex2.2.\nOu bien 'sortie' pour quitter ce programme: ", )
            a = a.lower()
            if a == 'sortie':
                fin = confirm_sortie()
            else:
                funct = 'exo_' + a
                if funct not in globals():
                    print "--- Exercice '%s' inconu" % a
                else:
                    eval(funct + '()')
     
    if __name__ == "__main__":
        main()
    Rien de méchant dans mes propos contre le posteur original, il doit découvrir la programmation et il faut bien un début à tout. Mais par contre franchement rambc et eyquem, vous qui écumez le forum tout les jours, laissez passer des trucs comme ça !!!

    P.S. : Dites moi, c'étais une caméra caché là, une grosse blague ?? Elle est ou la caméra hein, dites dites :p

  13. #13
    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
    Citation Envoyé par DelphiManiac Voir le message
    N'importe quelle fonction appelle n'importe qui, sans parler qu'on en rajoute une couche en exécutant une fonction après la saisie par raw_input qui peut appeler n'importe quoi.

    Rien de méchant dans mes propos contre le posteur original, il doit découvrir la programmation et il faut bien un début à tout. Mais par contre franchement rambc et eyquem, vous qui écumez le forum tout les jours, laissez passer des trucs comme ça !!!
    DelphiManiac a pété un boulot... Oui j'avais vu l'erreur moi aussi mais je n'ai pas que cela à faire (j'ai une préférence pour la partie PyQt du forum, je reste un amateur, et je travaille...).
    Maintenant si tu veux mon avis, créer un exerciseur en dur tel que proposé ci-dessus est sans intérêt si ce n'est pour apprendre à programmer. Une classe gérant les exercices, un dictionnaire contenant ces classes, et la définition des exercices se faisant via des fichiers simples à remplir de type txt, voilà comment je vois les choses (avec bien entendu une procédure pour analyser un dossier contenant les exercices pour ne pas avoir à faire la mise à jour à la main). On évite ainsi les appels à des fonctions "exercices" non souhaitées.

  14. #14
    Membre Expert
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Par défaut
    Rassures toi, je n'ai que ça à faire aussi, mais quitte à répondre, il vaut mieux ne pas laisser passer un code qui ressemble à du goto gwbasic de 25 ans d'age

    guillaume0612 doit en être à la phase d'apprentissage de la programmation et c'est celle là qui est sensible quand aux mauvaises habitudes.

    Mais ce n'est que mon avis et il vaut ce qu'il vaut :p

  15. #15
    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
    J'ai fait un petit test et DelphiManiac ta méthode semble robuste.

    Sans rancune.

  16. #16
    Membre Expert
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Par défaut
    Citation Envoyé par rambc Voir le message
    J'ai fait un petit test et DelphiManiac ta méthode semble robuste.

    Sans rancune.
    Pas de soucis, c'est juste qu'il faut, d'après moi, éviter de laisser passer les erreurs grossières

    Et la méthode que j'ai mise en place, n'est sûrement pas la meilleure, mais elle colle avec la mise en place originale.

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