Ответ 1
def files(a):
pass
while True:
try:
i = int(input('Select: '))
if i in range(4):
files(i)
break
except:
pass
print '\nIncorrect input, try again'
Я пытаюсь заставить пользователя ввести число от 1 до 4. У меня есть код для проверки правильности номера, но я хочу, чтобы код повторялся несколько раз, пока цифры не верны. Кто-нибудь знает как это сделать? Код ниже:
def Release():
try:
print 'Please select one of the following?\nCompletion = 0\nRelease ID = 1\nVersion ID = 2\nBuild ID = 3\n'
a = int(input("Please select the type of release required: "))
if a == 0:
files(a)
elif a == 1:
files(a)
elif a == 2:
files(a)
elif a == 3:
files(a)
else:
raise 'incorrect'
except 'incorrect':
print 'Try Again'
except:
print 'Error'
Release()
Я также получаю сообщение об ошибке, которую я ввел:
kill.py:20: DeprecationWarning: catching of string exceptions is deprecated
except 'incorrect':
Error
Спасибо за любую помощь
def files(a):
pass
while True:
try:
i = int(input('Select: '))
if i in range(4):
files(i)
break
except:
pass
print '\nIncorrect input, try again'
Современные исключения на Python - это классы; используя raise 'incorrect'
, вы используете устаревшую функцию языка, называемую строковыми исключениями. Раздел "Ошибки и исключения" в уроке Python будет хорошим местом для начала обработки основных исключений в Python.
В общем случае исключения не идеальны для вашей ситуации - простой цикл while
должен быть достаточным. Исключения должны быть зарезервированы для исключительных ситуаций, и плохой ввод пользователя не является исключительным, как ожидалось.
Версия на основе цикла Release
будет выглядеть примерно так:
def Release():
a = None
while a not in (0, 1, 2, 3):
print 'Please select one of the following?\nCompletion = 0\nRelease ID = 1\nVersion ID = 2\nBuild ID = 3\n'
try:
a = int(input("Please select the type of release required: "))
except ValueError:
pass # Could happen in face of bad user input
files(a)
P.S. a
- имя плохой переменной; вы должны, вероятно, изменить его на chosen_option
или что-то в этом роде.
Ваш подход, кажется, очень длинный способ сделать что-то довольно простое:
def Release() :
while True :
print 'Please select one of the following?\nCompletion = 0\nRelease ID = 1\nVersion ID = 2\nBuild ID = 3\n'
a = int(input("Please select the type of release required: "))
if 0 <= a < 4 :
files(a)
break
else :
print('Try Again')
Вы оба бросаете и ловите исключение в одном и том же простом блоке кода - на самом деле это не то, что касается обработки исключений. Вы можете сделать это лучше, либо вырваться из цикла, либо сохранить условие. Например:.
def isNumberCorrect(x):
return x in range(4)
def Release():
num = None # incorrect
while not isNumberCorrect(num):
print 'Please select one of the following?\nCompletion = 0\nRelease ID = 1\nVersion ID = 2\nBuild ID = 3\n'
num_str = raw_input("Please select the type of release required: ")
try:
num = int(num_str)
except ValueError:
num = None
if not isNumberCorrect(num):
print 'Incorrect!'
# work with num here; it guaranteed to be correct.
if __name__ == '__main__':
try:
Release()
except:
print 'Error!'
РЕДАКТИРОВАТЬ: Добавлена проверка ошибок в парсинге int.
Вместо использования исключений вы можете сделать что-то вроде этого:
...
a = raw_input("Please select the type of release required:")
while a not in ['0','1','2','3']: a = raw_input("Try again: ")
files(int(a))
...
def Release():
while 1:
print """Please select one of the following?
Completion = 0
Release ID = 1
Version ID = 2
Build ID = 3
Exit = 4 """
try:
a = int(raw_input("Please select the type of release required: "))
except Exception,e:
print e
else:
if a==4: return 0
files(a)