在保持类型的同时从python获取数字作为输入的最佳方法是什么

时间:2011-09-08 01:04:23

标签: python shell input command-line-interface

我正在尝试从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: ")

显然,这不是最佳方式。

4 个答案:

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

请参阅:http://docs.python.org/library/decimal.html

答案 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而不是硬编码时是正确的。