попробуй не проходить после дефа

Я просто пробую Python, и он мне очень нравится! Но я застрял с try/except.

У меня есть код, который проверяет, является ли raw_input целочисленным, но я хотел бы, чтобы он функционировал, а он не хочет им быть :)

вот код, у меня такой:

number_of_iterations = raw_input("What is your favorite number?")
try:
    int(number_of_iterations)
    is_number = True
except:
    is_number = False

while not is_number:
    print "Please put a number!"
    number_of_iterations = raw_input("What is your favorite number?")
    try:
        int(number_of_iterations)
        is_number = True
    except:
        is_number = False

Я не хочу повторяться здесь, и поэтому я думаю, что что-то собирается сделать функцию:

def check_input(input_number):
    try:
        int(input_number)
        return True
    except:
        return False

Но он делает ошибку, если вводит строку, говоря, что int нельзя использовать для строк. Похоже, он не видит ключевое слово «попробовать». Может smone объяснить, почему это происходит и как предотвратить это в будущем?


person Pruntoff    schedule 25.04.2013    source источник
comment
Что такое трассировка ошибок? Как вы звоните check_input?   -  person Henry Keiter    schedule 26.04.2013
comment
Не используйте except без определения класса ошибок. Это будет означать обработку KeyboardInterrupt или чего-то подобного. Используйте except ValueError или хотя бы Exception. Взгляните на pythons встроенные исключения.   -  person Vyktor    schedule 26.04.2013
comment
В случае исключения поднимите и посмотрите трассировку   -  person spicavigo    schedule 26.04.2013
comment
Лично я бы поместил return True в блок else блока try/except. Плохо нагромождать функциональность в блоке try, когда вы используете его как if, как здесь. Любые другие операторы, следующие за оператором, из которого вы фактически пытаетесь обработать ошибки, также будут перехвачены except, что может привести к раздражающим ошибкам. try что вы try делаете, else что try if делаете.   -  person Silas Ray    schedule 26.04.2013
comment
Я думаю, что ОП покинул нас. :)   -  person spicavigo    schedule 26.04.2013
comment
Я бы сказал, что вы делаете int(number_of_iterations) где-то вне блока try/except   -  person Krzysztof Bujniewicz    schedule 26.04.2013
comment
@Vyktor Это волшебство :) и это работа. Теперь буду осторожнее с исключениями. Странно, что он прошел, если он не работает. Спасибо за помощь.   -  person Pruntoff    schedule 26.04.2013
comment
@ sr2222 sr2222, но, насколько я понимаю, я не могу использовать здесь оператор if/else, raw_input всегда возвращает строку, даже если вы вводите число. поэтому оператор if всегда будет возвращать false.   -  person Pruntoff    schedule 26.04.2013
comment
Я не имею в виду буквально if, но вы используете блок try/except, чтобы в основном функционировать как оператор if. if not raised_exception(something()): do_stuff(). Помещение условного поведения в блок try похоже на вызов do_stuff() из something(), а не в результате того, что делает something().   -  person Silas Ray    schedule 26.04.2013


Ответы (2)


Попробуйте это, это позволяет избежать повторения без необходимости def

while True:
    try:
        number_of_iterations = int(raw_input("What is your favorite integer?"))
        break
    except ValueError:
        print "Please put an integer!"

EDIT: по предложениям комментаторов я добавил break в часть try блока, чтобы исключить else (оригинал остается в качестве ссылки ниже). Кроме того, я изменил «число» на «целое число», потому что «3.14» было бы недействительным в приведенном выше коде.

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

while True:
    try:
        number_of_iterations = int(raw_input("What is your favorite integer?"))
    except ValueError:
        print "Please put an integer!"
    else:
        break
person SethMMorton    schedule 25.04.2013
comment
очень элегантно, спасибо за ответ. Не знаю, мы можем использовать здесь else... переходим к документам. - person Pruntoff; 26.04.2013
comment
Или просто while True: try: number_of_iterations = ... break except ValueError: print "Please put a number!" - person Eric; 26.04.2013
comment
Возможно, вы могли бы избежать оператора else и включить break в оператор try под number_of_iterations. Может быть немного чище - person Nick Burns; 26.04.2013

Если вы хотите это как функцию, решите две вещи:

  • Что нужно для работы и
  • Что нужно, чтобы выплюнуть обратно.

Ваш вариант использования заключается в том, что вам нужен какой-то тип int, и если он по какой-либо причине выходит из строя, он определяется как не число.

Давайте создадим кортеж в качестве нашего возвращаемого значения, чтобы мы могли вернуть какое-то число и логическое значение для «если это число».

def check_input(number):
    try:
        return (int(number), True)
    except ValueError:
        return (-999999, False) # Care more about boolean here

Затем мы можем использовать это возвращаемое значение в нашем цикле while следующим образом. Обратите внимание, что я явно установил условие цикла на False, поэтому мы входим хотя бы один раз.

is_number = False
num = -999999 # Define out of scope of loop so it can be used

while not is_number:
    print "Please put a number!"
    num, is_number = check_input(raw_input("What is your favorite number?"))

Строка num, is_number является результатом упаковки кортежей. Поскольку мы возвращаем кортеж из нашего метода, мы можем установить две разные переменные для результатов этого кортежа.

person Makoto    schedule 25.04.2013
comment
это хорошо, но правильно ли я понимаю, что он всегда сначала попросит нас ввести число? И у меня есть один вопрос.. если вам не трудно объяснить, почему вы используете здесь такую ​​конструкцию return (int(number), True) и return (-999999, False) ? Во-первых, я понимаю, а во-вторых... что такое -999999? Это как-то связано с побитовым «~»? - person Pruntoff; 26.04.2013
comment
Нет, это фиктивное значение. По общему признанию, вы меньше заботитесь о целом, когда это не число, чем если бы оно было. И да, учитывая линейный поток через программу, если is_number равен False, вы всегда будете зацикливаться. - person Makoto; 26.04.2013