Bagaimanakah Saya Boleh Melaksanakan Input Pengguna Terikat Masa dalam Python?

Susan Sarandon
Lepaskan: 2024-11-27 07:43:16
asal
402 orang telah melayarinya

How Can I Implement Time-Bound User Input in Python?

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()
Salin selepas log masuk

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
Salin selepas log masuk

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
Salin selepas log masuk

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
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan