Zeitgebundene Benutzereingaben: Lösungen erkunden
In der dynamischen Welt der Programmierung ist es häufig notwendig, Benutzereingaben zeitliche Beschränkungen aufzuerlegen . Stellen Sie sich das Szenario vor, in dem Sie einem Benutzer eine Frage stellen und die Zeit begrenzen möchten, die er zum Antworten hat. Die Bewältigung dieser Aufgabe in Python mag einfach erscheinen, bringt jedoch eine Reihe eigener Herausforderungen mit sich.
Ein Ansatz besteht darin, das Threading-Modul zu verwenden. Indem Sie ein Timer-Objekt erstellen und dessen Dauer festlegen, können Sie einen Countdown starten. Während dieser Zeit bleibt der Code blockiert und wartet auf Benutzereingaben. Läuft die Zeit ab, bevor eine Antwort eintrifft, kann eine entsprechende Meldung angezeigt werden. Der folgende Codeausschnitt veranschaulicht diesen Ansatz:
from threading import Timer timeout = 10 t = Timer(timeout, print, ['Sorry, times up']) t.start() prompt = "You have %d seconds to choose the correct answer...\n" % timeout answer = input(prompt) t.cancel()
Diese Methode hat jedoch ihre Grenzen. Das Blockieren des Hauptthreads kann die Ausführung anderer Aufgaben innerhalb des Programms behindern. Daher werden alternative Ansätze erforderlich, die einen nicht blockierenden Betrieb ermöglichen.
Betriebssystemspezifische Lösungen
Für Windows-Systeme können Sie msvcrt Modul, das eine Low-Level-Schnittstelle für Tastatureingaben bereitstellt. Die Ausnahme TimeoutExpired wird ausgelöst, wenn das angegebene Zeitlimit überschritten wird, sodass Sie entsprechend mit der Situation umgehen können. Hier ist eine Implementierung:
import msvcrt import time class TimeoutExpired(Exception): pass def input_with_timeout(prompt, timeout, timer=time.monotonic): sys.stdout.write(prompt) sys.stdout.flush() endtime = timer() + timeout result = [] while timer() < endtime: if msvcrt.kbhit(): result.append(msvcrt.getwche()) #XXX can it block on multibyte characters? if result[-1] == '\r': return ''.join(result[:-1]) time.sleep(0.04) # just to yield to other processes/threads raise TimeoutExpired
Unix-basierte Verbesserungen
Auf Unix-ähnlichen Systemen können Sie das Modulselect erkunden. Damit können Sie Dateideskriptoren überwachen und auf bestimmte Ereignisse warten, einschließlich Tastatureingaben innerhalb eines bestimmten Zeitrahmens. Der folgende Codeausschnitt veranschaulicht diese Technik:
import select import sys def input_with_timeout(prompt, timeout): sys.stdout.write(prompt) sys.stdout.flush() ready, _, _ = select.select([sys.stdin], [],[], timeout) if ready: return sys.stdin.readline().rstrip('\n') # expect stdin to be line-buffered raise TimeoutExpired
Signal verwenden. Indem Sie einen Timer einstellen und das resultierende SIGALRM-Signal verarbeiten, können Sie der Benutzereingabe eine Zeitbeschränkung auferlegen. So geht's:
import signal def alarm_handler(signum, frame): raise TimeoutExpired def input_with_timeout(prompt, timeout): # set signal handler signal.signal(signal.SIGALRM, alarm_handler) signal.alarm(timeout) # produce SIGALRM in `timeout` seconds try: return input(prompt) finally: signal.alarm(0) # cancel alarm
Das obige ist der detaillierte Inhalt vonWie kann ich zeitgebundene Benutzereingaben in Python implementieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!