Maison > Article > développement back-end > Comment pouvez-vous définir une limite de temps pour la saisie de l'utilisateur dans la fonction `raw_input()` de Python ?
En Python, la fonction raw_input() suspend l'exécution d'un script jusqu'à ce que l'utilisateur fournisse une forme d'entrée. Cependant, que se passe-t-il si vous souhaitez définir une limite de temps pour cette entrée afin d'éviter que le script ne se bloque indéfiniment ?
Implémentation d'une limite de temps
Une approche, applicable aux systèmes basés sur Unix, consiste à utiliser la fonction signal.alarm. Lorsqu'elle est appelée avec une limite de temps en secondes, cette fonction déclenche une exception KeyboardInterrupt après la durée spécifiée, ignorant ainsi l'appel à raw_input().
Solutions multiplateformes
Pour une compatibilité multiplateforme ou si vous utilisez Windows, une méthode alternative consiste à utiliser threading.Timer en combinaison avec thread.interrupt_main .
import thread import threading def raw_input_with_timeout(prompt, timeout=30.0): print(prompt, end=' ') timer = threading.Timer(timeout, thread.interrupt_main) astring = None try: timer.start() astring = input(prompt) except KeyboardInterrupt: pass timer.cancel() return astring
Notez que cette approche traite de la même manière les entrées initiées par l'utilisateur et les délais d'attente, renvoyant Aucun pour les deux. scénarios. Si vous devez faire la distinction entre ces cas, vous pouvez modifier le code pour définir un indicateur lorsqu'un délai d'attente se produit et le gérer séparément dans le gestionnaire KeyboardInterrupt.
Implémentation spécifique à Windows
Pour une solution spécifique à Windows, vous pouvez exploiter une boucle qui interroge msvcrt.kbhit pour vérifier les entrées de l'utilisateur tout en surveillant simultanément le temps d'exécution. assurez-vous que le délai d'attente est appliqué.
import msvcrt import time def raw_input_with_timeout(prompt, timeout=30.0): print(prompt, end=' ') finishat = time.time() + timeout result = [] while True: if msvcrt.kbhit(): result.append(msvcrt.getche()) if result[-1] == '\r': return ''.join(result) time.sleep(0.1) else: if time.time() > finishat: return None
Considérez la valeur par défaut Valeur
Si vous souhaitez éviter de renvoyer Aucun en cas d'expiration du délai, vous pouvez modifier le code pour spécifier une valeur par défaut alternative à renvoyer dans de tels cas.
Personnalisation avancée
Pour éviter que la limite de temps ne s'applique aux utilisateurs qui tapent simplement lentement, vous pouvez recalculer le délai d'attente après chaque saisie de caractère, en vous assurant que le minuteur uniquement expire si la saisie est véritablement suspendue pendant une période prolongée.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!