Каков наилучший способ получить число в качестве ввода от Python при сохранении типа - PullRequest
1 голос
/ 08 сентября 2011

Я пытаюсь получить число в качестве ввода CLI от Python. Допустимый ввод должен быть int или float, и мне нужно поддерживать тип. Поэтому проверка типа int и возвращение числа с плавающей точкой не сработают.

Это лучшее, что мне удалось придумать, и это не так уж и хорошо.

def is_valid(n):
    try:
        if '.' in n: return float(n)
        return int(n)
    except ValueError:
        print "try again"

def num_input(s):
    n = raw_input(s)
    while is_valid(n) is None:
        n = raw_input(s)
    return is_valid(n)

valid_num = num_input("Enter a valid number: ")

Очевидно, что это не лучший способ.

Ответы [ 4 ]

8 голосов
/ 08 сентября 2011

используйте цикл for, чтобы попробовать все преобразования, я добавил сложный тип для демонстрации:

def is_valid(n):
    for t in (int, float, complex):
        try:
            return t(n)
        except ValueError:
            pass
    raise ValueError("invalid number %s" % n)

print is_valid("10")
print is_valid("10.0")
print is_valid("1+3.0j")
1 голос
/ 08 сентября 2011

Обдумав ранние ответы и немного подумав, я пришел к следующему решению:

def num_input(prompt, error):
    s = raw_input(prompt)
    for t in (int, float, complex):
        try: return t(s)
        except ValueError: pass
    print error
    return num_input(prompt, error) #better get it in the first 1k tries

Мне действительно нужна функция ввода, а не просто функция проверки; однако, я думаю, HYRY предложение перебрать int, float, complex является хорошим. Я принял предложение win использовать рекурсию вместо цикла, понимая, что действительно запутанный и постоянный пользователь может превысить максимальную глубину рекурсии. Хотя мне это и не нужно сейчас, я думаю, Карл Кнехтель правильно делает ошибку ошибочной, а не жестко закодированной.

1 голос
/ 08 сентября 2011

Попробуйте использовать десятичный модуль, который позволит вам поддерживать точность введенного числа, например:

import decimal

def num_input(s):
    while True:
        try:
            return decimal.Decimal(raw_input(s))
        except decimal.InvalidOperation, e:
            print e.message


valid_num = num_input("Enter a decimal number: ")

print 'ANSWER: ', valid_num

См .: http://docs.python.org/library/decimal.html

1 голос
/ 08 сентября 2011
def num_input(prompt, error):
    while True:
        result = raw_input(prompt)
        for candidate in (int, float):
            try: return candidate(result)
            except ValueError: pass
        print error
...