Python >> Tutoriel Python >  >> Python

Comment demander aux utilisateurs une entrée jusqu'à ce qu'ils fournissent une entrée valide ?

Résumé : Pour accepter des entrées valides de l'utilisateur, utilisez une boucle While avec validations personnalisées ou utilisez le PyInputPlus module pour éviter les définitions de validation fastidieuses. Vous pouvez également utiliser la récursivité pour inviter l'utilisateur à entrer l'entrée valide.

Aperçu

Problème : Compte tenu d'une entrée utilisateur ; accepter l'entrée uniquement si elle est valide sinon demander à l'utilisateur de ressaisir l'entrée dans le bon format.

Toute entrée de l'utilisateur doit être validée avant d'être traitée, sans une validation appropriée de l'entrée de l'utilisateur, le code contiendra très certainement des erreurs ou des bogues. Les valeurs que vous souhaitez qu'un utilisateur entre et les valeurs qu'il fournit en entrée peuvent être complètement différentes. Par exemple, vous voulez qu'un utilisateur entre son âge comme une valeur numérique valide positive, dans ce cas, votre code ne doit accepter aucune entrée invalide comme un nombre négatif ou des mots.

Remarque :En Python 2.7, raw_input() est utilisé pour obtenir une entrée utilisateur alors qu'en Python 3 et au-dessus, input() est utilisé pour obtenir une entrée utilisateur. input() convertit toujours l'entrée utilisateur en chaîne, vous devez donc la transtyper dans un autre type de données si vous souhaitez utiliser l'entrée dans un autre format.

Examinons un exemple pour comprendre notre énoncé de problème.

Exemple :

age = int(input("What is your age: "))
if age >= 18:
   print("You are an Adult!")
else:
   print("You are not an Adult!")

Sortie :

What is your age: 25
You are an Adult!

Cependant, le code ne fonctionne pas lorsque l'utilisateur saisit une entrée non valide. (C'est ce que nous voulons éviter. Au lieu d'une erreur, nous voulons que l'utilisateur ressaisisse une entrée valide.)

What is your age: twenty five
Traceback (most recent call last):
 File "C:/Users/Shubham-PC/PycharmProjects/pythonProject/main.py", line 1, in <module>
   age = int(input("What is your age: "))
ValueError: invalid literal for int() with base 10: 'twenty five'

Maintenant que nous avons une vue d'ensemble de notre problème, plongeons directement dans les solutions.

Méthode 1 :Mettre en œuvre la validation des entrées à l'aide de la boucle While et de la gestion des exceptions

La solution la plus simple consiste à accepter l'entrée de l'utilisateur dans une boucle while dans une instruction try.

  • Si l'entrée utilisateur n'est pas valide, nous utilisons le continue mot-clé dans le except bloc pour passer à l'itération suivante.
  • D'autres validations peuvent être spécifiées dans le else bloc, de sorte que, lorsque l'utilisateur saisit une entrée valide, nous utilisons le break pour sortir de la boucle, sinon si l'utilisateur entre une entrée invalide, la boucle while continue et l'utilisateur doit entrer à nouveau l'entrée correcte.

Examinons le code suivant pour comprendre ce concept :

while True:
   try:
       age = int(input("What is your age: "))
   except ValueError:
       print("Please Enter a valid age.")
       continue
   else:
       if age > 0:
           break
       else:
           print("Age should be greater than 0!")
if age >= 18:
   print("You are an adult!")
else:
   print("You are not an adult!")

Sortie :

What is your age: twenty five
Please Enter a valid age.
What is your age: -25
Age should be greater than 0!
What is your age: 25
You are an adult!

Méthode 2 :Utilisation du module PyInputPlus de Python

Une autre façon de gérer les entrées utilisateur consiste à utiliser le PyInputPlus module qui contient les différentes fonctions pour accepter des entrées de données spécifiques de l'utilisateur comme des nombres, des dates, des adresses e-mail, etc. Vous pouvez en savoir plus sur ce module dans la documentation officielle ici.

La fonction pour accepter un entier comme entrée de l'utilisateur est inputInt() .

Utilisation du PyInputPlus module nous pouvons nous assurer que l'entrée de l'utilisateur est valide car si un utilisateur entre une entrée invalide, PyInputPlus invitera l'utilisateur à ressaisir une entrée valide. Nous pouvons également spécifier d'autres validations en utilisant des arguments dans la fonction.

min = 1 :argument utilisé par nous pour s'assurer que l'âge dans notre exemple est supérieur à 1 .

Examinons le code ci-dessous pour mieux comprendre l'utilisation de PyInputPlus pour valider l'entrée de l'utilisateur.

Avertissement :PyInputPlus ne fait pas partie de la bibliothèque standard de Python. Vous devez donc l'installer séparément à l'aide de Pip.

import pyinputplus as pyip

# User is prompted to enter the age and the min argument ensures minimum age is 1
age = pyip.inputInt(prompt="Please enter your age: ", min=1)
if age >= 18:
   print("You are an Adult!")
else:
   print("You are not an Adult!")

Sortie :

Please enter your age: -1
Number must be at minimum 1.
Please enter your age: twenty five
'twenty five' is not an integer.
Please enter your age: 25
You are an Adult!

Méthode 3 :Implémentation de la récursivité

Une autre façon d'inviter l'utilisateur à saisir une entrée valide chaque fois que l'utilisateur saisit une valeur non valide consiste à utiliser la récursivité . La récursivité permet d'éviter l'utilisation d'une boucle. Cependant, cette méthode fonctionne bien la plupart du temps, sauf si l'utilisateur entre trop de fois les données invalides. Dans ce cas, le code se terminera par un RuntimeError: maximum recursion depth exceeded .

Solution :

def valid_input():
   try:
       age = int(input("Enter your Age: "))
   except ValueError:
       print("Please Enter a valid age. The Age must be a numerical value!")
       return valid_input()
   if age <= 0:
       print("Your Age must be a positive numerical value!")
       return valid_input()
   else:
       return age

x = valid_input()
if x >= 18:
   print("You are an Adult!")
else:
   print("You are not an Adult!")

Sortie :

Enter your Age: -1
Your Age must be a positive numerical value!
Enter your Age: twenty five
Please Enter a valid age. The Age must be a numerical value!
Enter your Age: 25
You are an Adult!

Méthode 4 :un hack rapide à l'aide de la fonction Lambda

Bien que cette méthode ne soit peut-être pas la meilleure en termes de complexité du code, elle peut s'avérer utile dans les situations où vous souhaitez utiliser une fonction une fois, puis la supprimer une fois l'objectif atteint. De plus, cette méthode affiche combien de temps les morceaux de codes peuvent être minimisés, donc cette méthode fait une entrée digne dans la liste de nos solutions proposées.

Voyons cette astuce dans le programme ci-dessous :

valid = lambda age: (age.isdigit() and int(age) > 0 and (
           (int(age) >= 18 and "You are an Adult!") or "You are not an Adult")) or \
                   valid(input(
                       "Invalid input.Please make sure your Age is a valid numerical vaule!\nPlease enter your age: "))
print(valid(input("Please enter your age: ")))

Sortie :

Please enter your age: -1
Invalid input. Please make sure your Age is a valid numerical vaule!
Please enter your age: 0
Invalid input. Please make sure your Age is a valid numerical vaule!
Please enter your age: twenty five
Invalid input. Please make sure your Age is a valid numerical vaule!
Please enter your age: 25
You are an Adult!

Conclusion

Ainsi, une validation appropriée des entrées de l'utilisateur est de la plus haute importance pour un code sans bogue et les méthodes suggérées ci-dessus pourraient s'avérer déterminantes pour atteindre notre cause. Je préfère l'utilisation de PyInputPlus car la définition de validations personnalisées peut devenir fastidieuse en cas d'exigences complexes. En outre, l'utilisation de méthodes récursives doit être évitée, sauf si vous êtes sûr de vos besoins, car elles nécessitent plus d'espace mémoire et génèrent souvent des exceptions de débordement de pile. lorsque les opérations sont trop importantes.

J'espère que vous avez trouvé cet article utile et qu'il vous aide à accepter facilement les entrées utilisateur valides. Veuillez vous abonner et rester à l'écoute pour plus de choses intéressantes à l'avenir !