代码之家  ›  专栏  ›  技术社区  ›  Kena

测试输入是格式良好的数字的最Python化的方法是什么

  •  2
  • Kena  · 技术社区  · 17 年前

    我有一个函数,它需要实数(整数或浮点数)作为输入,我试图在对它进行数学运算之前验证这个输入。

    我的第一直觉是将输入从try-except块内转换为浮点数。

    try:
       myinput = float(input)
    except:
       raise ValueError("input is not a well-formed number")
    

    我也可以打电话 isinstance(mydata, (float, int, long) ) 但“所有这些都可能是数字”的列表在我看来有点不雅。

    最像蟒蛇的方式是什么?还有我忽略的另一个选择吗?

    4 回复  |  直到 17 年前
        1
  •  12
  •   Community Mohan Dere    6 年前

    引用我自己的话 How much input validation should I be doing on my python functions/methods? :

    对于sum、factorial等计算,python内置的类型检查就可以了。计算将以调用add、mul等类型结束,如果它们中断,它们无论如何都会抛出正确的异常。通过强制执行自己的检查,您可能会使其他工作输入无效。

    因此,最好的选择是将类型检查留给Python。如果计算失败,Python的类型检查将给出异常,所以如果你自己做,你只需要重复代码,这意味着你需要做更多的工作。

        2
  •  5
  •   Brian    17 年前

    在Python 2.6和3.0中,数字抽象数据类型的类型层次结构 added ,因此您可以执行以下检查:

    >>> import numbers
    >>> isValid = isinstance(myinput , numbers.Real)
    

    数字。实数将匹配整数或浮点数类型,但不匹配非数字类型或复数(使用numbers.complex)。它也会匹配有理数,但大概你也想包括这些数字。即:

    >>> [isinstance(x, numbers.Real) for x in [4, 4.5, "some string", 3+2j]]
    [True, True, False, False]
    

    不幸的是,这些都是Python>=2.6,所以如果你正在为2.5或更早的版本开发,那么它就没有用了。

        3
  •  2
  •   Mapad    17 年前

    也许你可以使用以下组合 assert isinstance 声明。 我认为以下内容是一种更Python化的方式,因为每当您的输入不符合您的要求时,您都会抛出异常。不幸的是,我没有看到比你更好的定义来定义什么是有效数字。也许有人会想出更好的主意。

    number = (float, int, long)
    assert isinstance(mydata, (float, int, long))
    
        4
  •  1
  •   S.Lott    17 年前

    我不明白这个问题。

    有两种语义截然不同的东西被当作“替代品”。

    类型转换是一回事。它适用于任何支持 __float__ ,可以是各种各样的对象,其中很少是真正的数字。

    try:
       myinput = float(input)
    except:
       raise ValueError("input is not a well-formed number")
    # at this point, input may not be numeric at all
    # it may, however, have produced a numeric value
    

    型式试验是另一回事。这仅适用于作为特定类集的适当实例的对象。

    isinstance(input, (float, int, long) )
    # at this point, input is one of a known list of numeric types
    

    以下是响应的示例类 float ,但仍然不是数字。

    class MyStrangeThing( object ):
        def __init__( self, aString ):
            # Some fancy parsing 
        def __float__( self ):
            # extract some numeric value from my thing
    

    “实数(整数或浮点数)”这个问题通常无关紧要。许多东西都是“数字”的,可以在数字操作中使用,但不是整数或浮点数。例如,您可能已经下载或创建了有理数包。

    过度验证输入是没有意义的,除非你有一个不适用于某些类型的算法。这种情况很少见,但有些计算需要整数,特别是为了进行整数除法和余数运算。对于这些,你可能想断言你的值是整数。