Python 如何处理动态语言中错误的参数类型?
我找不到答案,但很可能这个论点已经讨论过了 我正试图用Python语言编写一个相当小的程序。这是我第一次“真正”体验动态语言,我更愿意用正确的方式做每件事。从一开始我就尝试应用的实践之一是单元测试 如何快速测试方法的参数类型是否正确?我应该这样做吗Python 如何处理动态语言中错误的参数类型?,python,unit-testing,dynamic-languages,Python,Unit Testing,Dynamic Languages,我找不到答案,但很可能这个论点已经讨论过了 我正试图用Python语言编写一个相当小的程序。这是我第一次“真正”体验动态语言,我更愿意用正确的方式做每件事。从一开始我就尝试应用的实践之一是单元测试 如何快速测试方法的参数类型是否正确?我应该这样做吗 例如,对于right类型,我的意思是检查使用浮点数的方法是否不是使用字符串调用的。在这种情况下,考虑这种方法显然应该接受整数,而不仅仅是浮动。< P>完全覆盖的单元测试实际上是处理依赖于动态语言的任何开发工作的唯一方法。显然,对静态类型的语言进行强覆
例如,对于right类型,我的意思是检查使用浮点数的方法是否不是使用字符串调用的。在这种情况下,考虑这种方法显然应该接受整数,而不仅仅是浮动。< P>完全覆盖的单元测试实际上是处理依赖于动态语言的任何开发工作的唯一方法。显然,对静态类型的语言进行强覆盖测试是非常有益的,但根据我的经验,在使用动态类型时,这一点更为重要 如果您没有涵盖测试中可以运行的所有代码,那么实际上您是在自找麻烦。因此,您希望在单元测试中使用覆盖率分析工具来证明您正在访问所有代码
即使这样也不能防止所有的陷阱——您的测试确实需要练习您的程序可能收到的所有可能错误的输入数据错误。您不应该测试特定类型。根据,您只需根据需要使用传入的对象,并为用户提供提供定制实现的机会 根据函数的功能,可能适合将参数转换为预期类型:
def my_func(a):
a = float(a)
# ...do stuff...
另一个很好的选择是使用hasattr()
在使用前检查所需的成员。这将使您抛出一个有用的异常,而不是默认的AttributeError
如何快速测试方法的参数类型是否正确
最快的办法是什么也不做
真的。动态语言解释器(在本例中为Python)的检查速度远远快于您编写的任何代码。它只会引发一个异常,这就是您所需要做的。没什么
我应该这样做吗
永远不要测试正确的类型。一般来说,你不能这么做
假设您有一个需要“数字”的函数
糟糕的政策。您的函数可以长时间工作,也可以像int一样浮动
assert instance( x, (int, long, float) )
糟糕的政策。你还是把复杂的排除在外。实际上,您还排除了同样有效的数字decimal.decimal
和分数.Rational
通过“类型检查”,您将排除有效的类型。当有人“误用”您的函数或类并提供错误的类型时,您唯一能做的就是假设类型是正确的,并优雅地处理异常
处理类型错误的最优雅方法是什么
什么也不做。程序应完全崩溃。“理想情况下”可以删除。您不需要“测试”类型。解释器测试类型。你只需要使用这个对象。
assert instance( x, (int, long, float) )