如何在动态语言中处理错误的参数类型?

时间:2011-01-24 14:37:59

标签: python unit-testing dynamic-languages

我无法在SO上找到答案,但很可能已经讨论了这个论点。

我正在尝试使用Python语言编写一个非常小的程序。这是我用动态语言的第一次“真实”体验,我宁愿以正确的方式做所有事情。我从一开始就尝试应用的一种做法是单元测试。

如何快速测试方法的参数是否正确?我应该这样做吗?

使用正确的类型我的意思是例如检查一个使用浮点数的方法不是用String调用的。在这种情况下,考虑方法显然应该接受整数而不仅仅是浮动的可能性。

3 个答案:

答案 0 :(得分:3)

您不应该测试特定类型。根据{{​​3}},您应该根据需要使用传入的对象,并为用户提供提供自定义实现的机会。

根据您的函数的作用,将参数转换为期望的类型可能是合适的:

def my_func(a):
    a = float(a)
    # ...do stuff...

另一个很好的选择是在使用之前使用hasattr()检查所需的成员。这会让你抛出一个有用的异常,而不是默认的AttributeError。

答案 1 :(得分:3)

  

如何快速测试方法的参数是否属于正确类型?

最快捷的方法是什么都不做。

严重。动态语言解释器(在本例中为Python)将比您编写的任何代码检查得更快。它只会引发异常,而这就是你需要做的。什么都没有。

  

我应该这样做吗?

永远不要测试正确的类型。你不能 - 通常 - 做到这一点。

假设你有一个需要“数字”的功能

def some_func( x ):
    assert isinstance(x, int)

糟糕的政策。你的函数可以长时间工作,也可以像int一样工作。

assert instance( x, (int, long, float) )

糟糕的政策。你仍然排除了复杂。实际上,您还排除了decimal.Decimalfractions.Rational也是有效数字。

通过“类型检查”,您将排除有效类型。你唯一能做的就是假设这些类型是正确的,当有人“误用”你的函数或类并提供错误的类型时,它会优雅地处理异常。

处理TypeError的最优雅方式?

什么都不做。程序应该完全崩溃。

答案 2 :(得分:1)

完全覆盖的单元测试实际上是处理依赖于动态语言的任何开发工作的唯一方法。显然,对静态类型语言进行强大的覆盖测试是非常有益的,但根据我的经验,当你进行动态输入时更为重要。

如果你没有涵盖测试中可以运行的所有代码,那么你真的要求麻烦了。因此,您希望将覆盖率分析工具与单元测试结合使用,以证明您已达到所有代码。

即使这样也无法防范所有陷阱 - 您的测试确实需要执行程序可能收到的所有可能错误的输入数据错误。