2015-05-04 2 views
-1

Привет У меня есть эта проблема с функцией, которую я создал в Python:Проблема с попытками ограничить типов данных входов

def intcheck(num) 
    if isinstance(num, int): 
     return num 
    else: 
     intcheck(input("Invalid datatype: Input integer only: ")) 

Он должен проверить, если вход является целым числом, и если это не так, спросите пользователь для другого ввода, затем проверьте, что один, ect. ЭСТ.

Однако код, похоже, застрял в инструкции else: так, что даже правильный ввод не вернется, и он просто запросит еще один вход на неопределенный срок.

+2

Вам необходимо преобразовать вход в int –

+0

'import pdb; pdb.set_trace(); print type (num) ' –

+0

, и вам нужно« вернуть intcheck (...) »в ветку' else', иначе ваша функция вернет 'None' в этом случае. –

ответ

1

Более простой способ:

def is_int(foo): 
    try: 
     return int(foo) 
    except ValueError: 
     print('{} is not a number'.format(foo)) 
     return is_int(input('Please enter a number: ')) 

Если вы на Python 2, убедитесь, что вы используете raw_input вместо input.

0

Вы забыли, что функция input возвращает объект str! Итак, вы навсегда зацикливаетесь на другом месте функции intcheck. Вместо этого, вы можете сделать это:

def intcheck(num): 
    if isinstance(num, int): 
     return num 
    else: 
     input_string = input("Invalid datatype: Input integer only: ") 
     try: 
      input_int = int(input_string) 
     except ValueError: 
      input_int = input_string 
     finally: 
      intcheck(input_int) 
+0

в Python 2.x, 'input()' пытается преобразовать его значение. «Эквивалент eval (raw_input (prompt))». –

+0

@brunodesthuilliers Если бы OP использовал Python 2.x, он бы никогда не разместил свой вопрос. – Spirine

+0

Возможно, да, но вопрос явно не помечен как Python 3, а кто-то другой, использующий Python 2, мог бы прочитать ответы и не смог получить подразумеваемый контекст. –

0

ввода в Python является всегда загружается в виде строки, так, во-первых, вам необходимо преобразовать входной сигнал в один. Элегантный способ - проверить это с помощью исключений: если это int, верните его, а если нет, попросите ввести другой вход.

def intcheck(num): 
    try: 
     return int(num) 
    except ValueError: 
     return intcheck(input("That is not a integer, please enter integer: ")) 
+0

в Python 2.x, 'input()' пытается преобразовать его значение. «Эквивалент eval (raw_input (prompt))». –

+0

Поскольку в вопросе используется 'input', я предполагаю, что он использует Python 3.x – Adalee

1

Если вы используете Python 3.x, input() возвращает строку, так что вы должны преобразовать его в междунар. Если вы используете Python 2.x, то действительно вместо этого должен использовать raw_input() (Python 2.x input() очень опасен), а так как raw_input() - это то же самое, что и Python 3.x input(), вам также нужно преобразовать строку к int.

В обоих случаях вам нужно вернуть результат рекурсивного вызова в разделе else, как показано в других ответах.

Теперь, используя рекурсию этот путь, в то время как, возможно, «элегантный», это не самое простое решение - хороший старый в то время как цикл работает отлично и позволяет избежать укладки кадров (Python не делают оптимизацию хвостовой рекурсии):

def checkint(): 
    while True: 
     num = input("your prompt here") 
     try: 
      return int(num) 
     except ValueError: 
      print "'{}' is not a valid integer".format(num) 
Смежные вопросы