Python 2.7 попробуйте и за исключением ValueError
Я запрашиваю пользовательский ввод, который, как ожидается, будет int, используя int (raw_input (...))
Однако, когда пользователь не вводит целое число, то есть просто обращается к возврату, я получаю значение ValueError.
def inputValue(inputMatrix, rangeRows, rangeCols, defaultValue, playerValue):
rowPos = int(raw_input("Please enter the row, 0 indexed."))
colPos = int(raw_input("Please enter the column, 0 indexed."))
while True:
#Test if valid row col position and position does not have default value
if rangeRows.count(rowPos) == 1 and rangeCols.count(colPos) == 1 and inputMatrix[rowPos][colPos] == defaultValue:
inputMatrix[rowPos][colPos] = playerValue
break
else:
print "Either the RowCol Position doesn't exist or it is already filled in."
rowPos = int(raw_input("Please enter the row, 0 indexed."))
colPos = int(raw_input("Please enter the column, 0 indexed."))
return inputMatrix
Я пытался быть умным и использовать try и за исключением того, чтобы поймать ValueError, распечатать предупреждение пользователю и снова вызвать inputValue(). Затем он работает, когда пользователь возвращается к запросу, но падает, когда пользователь правильно вводит целое число
Ниже приведена часть измененного кода с помощью try и за исключением:
def inputValue(inputMatrix, rangeRows, rangeCols, defaultValue, playerValue):
try:
rowPos = int(raw_input("Please enter the row, 0 indexed."))
except ValueError:
print "Please enter a valid input."
inputValue(inputMatrix, rangeRows, rangeCols, defaultValue, playerValue)
try:
colPos = int(raw_input("Please enter the column, 0 indexed."))
except ValueError:
print "Please enter a valid input."
inputValue(inputMatrix, rangeRows, rangeCols, defaultValue, playerValue)
Ответы
Ответ 1
Быстрое и грязное решение:
parsed = False
while not parsed:
try:
x = int(raw_input('Enter the value:'))
parsed = True # we only get here if the previous line didn't throw an exception
except ValueError:
print 'Invalid value!'
Это приведет к тому, что пользователь будет вводить запрос до тех пор, пока parsed
не будет True
, что произойдет только в случае отсутствия исключения.
Ответ 2
Вместо того, чтобы вызывать inputValue
рекурсивно, вам нужно заменить raw_input
своей собственной функцией на проверку и повторить попытку. Что-то вроде этого:
def user_int(msg):
try:
return int(raw_input(msg))
except ValueError:
return user_int("Entered value is invalid, please try again")
Ответ 3
Что-то вроде этого, для чего вы собираетесь?
def inputValue(inputMatrix, defaultValue, playerValue):
while True:
try:
rowPos = int(raw_input("Please enter the row, 0 indexed."))
colPos = int(raw_input("Please enter the column, 0 indexed."))
except ValueError:
continue
if inputMatrix[rowPos][colPos] == defaultValue:
inputMatrix[rowPos][colPos] = playerValue
break
return inputMatrix
print inputValue([[0,0,0], [0,0,0], [0,0,0]], 0, 1)
Вы были правы, чтобы попытаться обработать исключение, но вы, похоже, не понимаете, как работают функции... Вызов inputValue изнутри inputValue называется рекурсией, и это, вероятно, не то, что вы хотите здесь.