Каков наилучший способ получить число в качестве ввода от Python при сохранении типа

1

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

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

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: ")

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

  • 3
    В то время как вы, вероятно, получите несколько предложений о том, как настроить этот код и сделать его немного более Pythonic, я на самом деле думаю, что подход разумный - я не уверен, почему вам ясно, что это, на самом деле, не самый лучший способ , :)
  • 0
    Это не будет работать для "1e3", например. float("1e3") работает, но int("1e3") не работает
Показать ещё 1 комментарий
Теги:
input
command-line-interface

4 ответа

1
Лучший ответ

Рассмотрев ранние ответы и подумав об этом, я решил немного больше:

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 является хорошим. Я взял предложение выигрыша использовать рекурсию вместо цикла, понимая, что действительно запутанный и постоянный пользователь может превышать максимальную глубину рекурсии. Хотя мне это не нужно сейчас, я думаю, что Карл Кнечтель прав, сделав ошибку arg вместо жесткого кодирования.

8

используйте цикл 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
    это всегда возвращало бы, скажем, 1.2 как int!
  • 0
    int ("1.2") повышает ValueError, int (1.2) возвращает 1. в этом случае n - это строка, введенная raw_input.
Показать ещё 2 комментария
1

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

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
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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню