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 ?

Comment pouvez-vous définir une limite de temps pour la saisie de l'utilisateur dans la fonction `raw_input()` de Python ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-18 22:45:02945parcourir

How can you set a time limit on user input in Python's `raw_input()` function?

Personnalisation de l'entrée brute avec des contraintes de temps

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn