【发布时间】:2012-09-08 15:55:12
【问题描述】:
我们的项目变得有点大,前几天我遇到了这个问题,当我试图向一个函数添加一个简单的错误消息时:
def create_report(id):
report = new_report(id)
if not report:
raise api_error('Could not find report with id %d' % (id,))
...
问题? id 是一个字符串,当它尝试将其格式化为数字时它崩溃了。我不是该函数的原作者,并错误地认为id 是一个数字。相反,它应该是一个字符串。哎呀。
如果这是一种强类型语言,我会立即从编译器中得到一个错误;处理这类事情的最佳方法是什么?我应该检查每个参数的类型(似乎需要做很多工作),还是应该将所有内容都放在try: 块中?也许我们应该在每个函数中写一个注释来描述它的参数?或者我只是应该知道的更好?
【问题讨论】:
-
不,你使用单元测试和集成测试来发现这些问题。
-
非常糟糕的例子。在大多数流行的静态类型编程语言中,等效函数(
sprintf、String.Format等)也没有类型,至少不会以任何方式允许编译器决定它的某些使用是否正确。 -
@delnan,很抱歉我在静态类型语言方面的经验有限。 FWIW,Xcode 给了我一个“格式指定类型'int',但参数有类型'NSString *'警告(但不是错误)。
-
在这里检查类型也无济于事。你以为你得到的是一个 int,所以你会断言 id 是一个 int。该断言会引发异常。但这就是这里发生的事情:它引发了一个异常。你将一无所获。
-
@speg 是的,如果格式字符串是恒定的并且工具会费心,这样的分析是可能的。但这并不总是可能的,并且与静态类型无关,因为它不需要/使用感兴趣的函数的类型,仅用于参数。如果格式字符串是动态的,或者您已经丢失了有关参数的确切类型的信息(例如,在包装函数或通用代码中),这将变得不可能。
标签: python dynamic-typing