我对他们编写的Python中有多少前期验证感兴趣.
以下是一些简单函数的示例:
def factorial(num): """Computes the factorial of num.""" def isPalindrome(inputStr): """Tests to see if inputStr is the same backwards and forwards.""" def sum(nums): """Same as the built-in sum()... computes the sum of all the numbers passed in."""
在开始计算之前检查输入值有多彻底,如何进行检查?如果输入有问题(例如,在同一模块中定义了BadInputException),是否会抛出某种专有异常?你刚刚开始你的计算,并认为如果传入错误的数据(例如,"asd"到factorial),它会在某个时刻抛出异常吗?
当传入的值应该是一个容器时,你不仅检查容器,还检查其中的所有值?
那些像factorial这样的情况怎么样,传入的内容可以转换为int(例如浮点数),但这样做可能会失去精度?
我assert
绝对必要的.
重要:什么是绝对必要的.有些人过度测试东西.
def factorial(num): assert int(num) assert num > 0
不完全正确.长期也是合法的可能性.
def factorial(num): assert type(num) in ( int, long ) assert num > 0
更好,但仍然不完美.许多Python类型(如有理数或类似数字的对象)也可以在良好的阶乘函数中工作.很难断言一个对象具有类似于整数的基本属性,而不是过于具体,并且不需要考虑未来的未考虑过的类.
我从不为各个函数定义唯一的例外.我为重要的模块或包定义了一个唯一的例外.然而,通常只是一个Error
类或类似的东西.这样,应用程序说明except somelibrary.Error,e:
了您需要了解的所有内容.细粒度的例外变得挑剔和愚蠢.
我从来没有这样做过,但我可以看到可能需要的地方.
assert all( type(i) in (int,long) for i in someList )
但是,通常,普通的Python内置类型检查工作正常.他们发现几乎所有特殊情况几乎一直都很重要.当某些东西不是正确的类型时,Python会引发一个始终指向正确代码行的TypeError.
BTW.如果我绝对确定该函数会被滥用,我只会在设计时添加断言.我有时会在我进行单元测试时以不明显的方式失败时添加断言.
对于sum,factorial等计算,pythons内置类型检查会很好.计算将结束upp 为类型调用add,mul等,如果它们中断,它们将抛出正确的异常.通过强制执行您自己的检查,您可能会使其他工作输入无效.
我正在尝试编写文档字符串,说明期望和接受哪种类型的参数,我不会在我的函数中明确地检查它.
如果有人想要将我的功能与任何其他类型一起使用,那么他有责任检查他的类型是否模仿我的类型,我接受得足够好.也许你的阶乘可以用一些自定义类似长度来获得你想不到的东西?或者你的总和可以用来连接字符串?为什么要通过类型检查来禁止它?反正它不是C.