我有一个函数,它期望实数(整数或浮点数)作为它的输入,我试图在对它进行数学运算之前验证这个输入.
我的第一直觉是将输入作为浮点数从try-except块中转换出来.
try: myinput = float(input) except: raise ValueError("input is not a well-formed number")
我也可以打电话,isinstance(mydata, (float, int, long) )
但"所有这些可能是数字"的清单对我来说似乎有点不合适.
最狡猾的方式是什么?我忽略了另一种选择吗?
引用自己我应该对我的python函数/方法进行多少输入验证?:
对于sum,factorial等计算,pythons内置类型检查会很好.计算将结束upp为类型调用add,mul等,如果它们中断,它们将抛出正确的异常.通过强制执行您自己的检查,您可能会使其他工作输入无效.
因此,最好的选择是将类型检查留给Python.如果计算失败,Python的类型检查将给出异常,因此如果您自己执行此操作,则只需复制代码即可代表您完成更多工作.
在Python 2.6和3.0,数字抽象数据类型的类型层次结构已被添加,所以你可以执行你的支票:
>>> import numbers >>> isValid = isinstance(myinput , numbers.Real)
numbers.Real将匹配integer或float类型,但不是非数字类型或复数(使用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或更早版本,则无用.