Попробуй Python 2.7 кроме ValueError - PullRequest
14 голосов
/ 17 февраля 2011

Я запрашиваю пользовательский ввод, который, как ожидается, будет int, используя int (raw_input (...))

Однако, когда пользователь не вводит целое число, то есть просто нажимает return, я получаю 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

Я пытался проявить смекалку и использовал попытку, за исключением того, что перехватывал ValueError, печатал предупреждение для пользователя и затем снова вызывал inputValue (). Затем он работает, когда пользователь вводит return в запрос, но падает, когда пользователь правильно вводит целое число

Ниже приведена часть измененного кода с попыткой и исключением:

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)   

Ответы [ 3 ]

30 голосов
/ 17 февраля 2011

Быстрое и грязное решение:

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 голосов
/ 17 февраля 2011

Вместо рекурсивного вызова 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")
1 голос
/ 17 февраля 2011

Что-то вроде этого вы собираетесь?

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 называется рекурсией, и это, вероятно, здесь не то, что вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...