我正在尝试从python获取一个数字作为CLI输入。有效输入应该是int或float,我需要维护类型。所以验证一个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: ")
显然,这不是最佳方式。
答案 0 :(得分: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)
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
答案 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
答案 3 :(得分: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是一个很好的建议。我采用win的建议来使用递归而不是循环,理解一个真正困惑和持久的用户可能超过最大递归深度。虽然我现在不需要它,但我认为Karl Knechtel在使错误成为arg而不是硬编码时是正确的。