Рекурсивная функция для запроса пользовательского ввода в Python с обработкой ошибок - PullRequest
0 голосов
/ 10 мая 2019

Я пишу небольшой скрипт на Python, который нуждается в информации, передаваемой пользователем.Поскольку некоторые части моего скрипта могут вызвать исключение и, следовательно, нарушить работу скрипта, если пользовательский ввод имеет неправильный формат, я бы хотел проверить это заранее.Это полезная мера в любом случае, конечно.Для удобства пользователей я не хочу, чтобы сценарий прерывался, если ввод был в неправильном формате.Вместо этого следует задать вопрос.

Поэтому я определил функцию для каждого пользовательского ввода, которая будет проверять ввод перед переходом к следующему шагу.Эта проверка выполняется с помощью метода обработки ошибок try, except, чтобы убедиться, что сценарий не прерывается.

Вот минимальный пример такой функции:

def ask_for_int( prompt = "Please enter an integer:\n" ):
    user_input = input( prompt ).strip()

    # Check if the value can be transformed into a float
    try:
        return int( user_input )
    except:
        ask_for_int( prompt = "You need to pass an integer:\n" )

some_number = ask_for_int()

Этот код работает нормально, пока я ввожу целое число.Если я передаю ему строку, он также распознает исключение TypeException и повторно запрашивает целое число.К сожалению, однако, переменная some_number теперь не содержит переданного мною целого числа, но она пуста.

Чтобы прояснить это, взглянем на следующее:

Давайте сначала добавим print( 'You passed the valid integer: %s' % some_number ) в конце предыдущего примера.Если мы теперь передадим, скажем, 123 приглашению, печать вернет 123.Ура!

Однако, если мы передадим abc, скрипт откажется от нашего ввода и запросит новый номер. Это except, работающий здесь.Теперь давайте выполним эту задачу и фактически передадим целое число, например 321.Печать должна вернуть 321, конечно, потому что это целое число, которое было принято, не так ли?Ну, к сожалению, вывод равен None.

Вот необработанный вывод:

Передача целого числа

Please enter an integer:
123
You passed the valid integer: 123

Сначала передавая строку, затем целое число

Please enter an integer:
abc
You need to pass an integer:
321
You passed the valid integer: None

Ответы [ 2 ]

3 голосов
/ 10 мая 2019

Вы не возвращаете результат своего рекурсивного вызова, поэтому функция возвращает None.

Где у вас есть:

ask_for_int( prompt = "You need to pass an integer:\n" )

Запись:

return ask_for_int( prompt = "You need to pass an integer:\n" )
2 голосов
/ 10 мая 2019

Это потому, что блок except не возвращает никакого значения. Я рекомендую вам изменить его на:

    try:
        user_input = int(user_input)
    except:
        user_input = ask_for_int(prompt="You need to pass an integer:\n")
    return user_input 
...