В версии Блоха используется Class.cast ()
, который реализован как return (T) obj
, неконтролируемый актерский состав. Это обман в том смысле, что предупреждение компилятора о неконтролируемом акте перемещается в предварительно скомпилированную библиотеку lib. Тип безопасности броска не защищен компилятором, а логикой приложения.
Вы также не должны беспокоиться о неконтролируемом литье. Существуют типы отношений, которые не могут быть выражены на языке, но программисты знают, что это правда. Так что просто отмените компилятор, скажите, что бросок безопасен.
Исправление
Мое понимание о «непроверенном акте» было неверным.
Класс.cast ()
не содержит «непроверенный бросок». Приведение выполняется после «проверки», если приведение выполняется во время выполнения, это гарантировано.
T cast (Object obj), если obj является экземпляром этого класса // check return (T) obj; // cast else throw new ClassCastException
Интересная проблема: похоже, это работает:
import time
from threading import Thread
answer = None
def check():
time.sleep(2)
if answer != None:
return
print "Too Slow"
Thread(target = check).start()
answer = raw_input("Input something: ")
Если допустимо блокировать основной поток, когда пользователь не предоставил ответа:
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()
В противном случае вы могли бы использовать ответ @Alex Martelli (измененный для Python 3) в Windows (не тестировалось):
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] == '\n': #XXX check what Windows returns here
return ''.join(result[:-1])
time.sleep(0.04) # just to yield to other processes/threads
raise TimeoutExpired
Использование:
try:
answer = input_with_timeout(prompt, 10)
except TimeoutExpired:
print('Sorry, times up')
else:
print('Got %r' % answer)
В Unix вы можете попробовать:
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
Или:
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
input()
не прерывается в первом примере, поэтому есть: & quot; Если допустимо блокировать основной поток & quot; i> до примера. Если вам нужно interrtupt ввода, используйте следующие примеры с input_with_timeout()
.
– jfs
30 September 2016 в 20:00
import signal
один, и его чувство времени, похоже, далеко. Я использую Cloud9 IDE. Если я дам ему тайм-аут .5, он будет ждать около 3 секунд до истечения времени.
– Pro Q
3 February 2017 в 06:16
threading.Timer
вместоThread
+time.sleep
. В Python 3 нетraw_input
. – jfs 20 March 2013 в 22:08