Input Pengguna Terikat Masa: Meneroka Penyelesaian
Dalam dunia pengaturcaraan yang dinamik, sering kali menjadi perlu untuk mengenakan kekangan masa pada input pengguna . Pertimbangkan senario di mana anda ingin mengemukakan soalan kepada pengguna dan hadkan masa yang mereka ada untuk menjawab. Mencapai tugasan ini dalam Python mungkin kelihatan mudah, tetapi ia memperkenalkan set cabarannya sendiri.
Satu pendekatan melibatkan penggunaan modul benang. Dengan mencipta objek Pemasa dan menetapkan tempohnya, anda boleh memulakan kira detik. Dalam tempoh ini, kod kekal disekat, menunggu input pengguna. Jika masa tamat sebelum respons diterima, mesej yang sesuai boleh dipaparkan. Coretan kod di bawah menunjukkan pendekatan ini:
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()
Walau bagaimanapun, kaedah ini mempunyai hadnya. Menyekat utas utama boleh menghalang pelaksanaan tugas lain dalam program. Oleh itu, pendekatan alternatif yang membolehkan operasi tanpa sekatan menjadi perlu.
Penyelesaian Khusus OS
Untuk sistem Windows, anda boleh memanfaatkan msvcrt modul, yang menyediakan antara muka peringkat rendah untuk input papan kekunci. Pengecualian TimeoutExpired dinaikkan jika melebihi had masa yang ditentukan, membolehkan anda mengendalikan situasi dengan sewajarnya. Berikut ialah pelaksanaan:
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
Peningkatan Berasaskan Unix
Pada sistem seperti Unix, anda boleh meneroka modul pilih. Ia membolehkan anda memantau deskriptor fail dan menunggu acara tertentu, termasuk input papan kekunci dalam jangka masa tertentu. Coretan kod berikut menunjukkan teknik ini:
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
Sebagai alternatif, anda boleh menggunakan modul isyarat. Dengan menetapkan pemasa dan mengendalikan isyarat SIGALRM yang terhasil, anda boleh mengenakan kekangan masa pada input pengguna. Begini cara untuk melakukannya:
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
Pendekatan ini menawarkan alternatif tanpa sekatan kepada input pengguna had masa, memberikan lebih fleksibiliti dan kawalan dalam program Python anda.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Melaksanakan Input Pengguna Terikat Masa dalam Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!