Я пытаюсь получить число как ввод 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: ")
Ясно, что это не лучший способ.
Рассмотрев ранние ответы и подумав об этом, я решил немного больше:
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 вместо жесткого кодирования.
используйте цикл 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")
Попробуйте использовать десятичный модуль, который позволит вам точно точно точно ввести введенное число, например:
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
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
float("1e3")
работает, ноint("1e3")
не работает