2010-05-25 4 views
0

J'essaie de créer un menu basé sur du texte en Python.Traitement du menu texte en Python

Voici le code:

#!/usr/bin/env python 

def testcaseOutput(): 

    print '1. Add. 2. Subtract. 3. Divide. 4. Multiply' 

    try: 
     answer = int(raw_input('Enter a value (1 - 4) >. ')) 
    except ValueError: 
     print 'Invalid input. Enter a value between 1 -4 .' 
     testcaseOutput() 

    if answer in range(1, 5): 
     return answer 
    else: 
     print 'Invalid input. Enter a value between 1 - 4.' 
     testcaseOutput() 

Ma question:

Lorsque l'utilisateur entre une entrée non valide, à savoir pas un numéro, je veux que cette fonction s'appelle à nouveau. J'ai donc utilisé l'approche récursive que je considère comme un mauvais design. J'utilise cette approche à nouveau dans le

if answer in range(1, 5). 

Y at-il une autre façon de gérer cela? J'ai besoin de l'invite appelée à nouveau quand il y a une entrée invalide.

De plus, y a-t-il un moyen de mapper les deux contraintes: vérifier si l'entrée est un nombre et vérifier si le nombre est dans la plage (1,5) ensemble? Comme vous pouvez le voir, je vérifie cela individuellement.

+0

connexes: http://www.wellho.net/resources/ex.php4?item=y103/python_switch_case – badp

Répondre

3

Un remaniement possible est d'utiliser une boucle, qui continue à imprimer les instructions et lire les entrées jusqu'à ce que l'entrée acceptable a été donnée:

def testcaseOutput(): 
    while True: 
     print '1. Add. 2. Subtract. 3. Divide. 4. Multiply' 

     try: 
      answer = int(raw_input('Enter a value (1 - 4) >. ')) 
     except ValueError: 
      print 'Invalid input. Enter a value between 1 -4 .' 
      continue 

     if not answer in range(1, 5): 
      print 'Invalid input. Enter a value between 1 - 4.' 
      continue 

     return answer 
+0

Merci. Je voulais utiliser une boucle mais je n'avais aucune idée de comment y arriver. – user225312

1

Placer le corps de la fonction dans une boucle while True: (retrait de la appel récursif, bien sûr).

2
def testcaseOutput(): 

    answer = None 
    legal_answers = ['1','2','3','4'] 
    tried = False 
    while answer not in legal_answers: 
     print "%s1. Add. 2. Subtract. 3. Divide. 4. Multiply" % \ 
       "Invalid input. " if tried else "" 
     answer = raw_input('Enter a value (1 - 4) >. ') 
     tried = True 

    return answer #int(answer) if you really do want integers