03-类型提示的格式
C.2 类型提示的格式
类型提示应该添加到声明变量或函数的代码行中。变量或函数参数的类型提示用冒号“ :
”开始,函数返回值的类型提示用箭头“ ->
”开始。例如,考虑以下Python代码行:
def repeat(item, times):
如果不阅读函数的定义,你能说出这个函数要完成什么功能吗?要把某个字符串打印指定次?还是别的什么功能?当然,通过阅读函数定义可以弄清楚它的功能,但会耗费更多的时间。遗憾的是,该函数的作者没有提供任何注释文档。下面用类型提示再来试一遍:
def repeat(item: Any, times: int) -> List[Any]:
这样就清楚多了。只看类型提示就能明白,该函数以 Any
类型的 item
为参数,并会返回一个填入了 times
个 item
的 List
。当然,注释文档仍然有助于让该函数更易于理解,但至少使用该库的用户现在知道了该提供什么类型的值给它,以及它应该返回什么类型的值。
假定该函数要用的库只支持浮点数,并且该函数将用于设置供其他函数使用的列表。要修改类型提示十分简单,只要标明这种浮点数约束即可:
def repeat(item: float, times: int) -> List[float]:
现在很清楚了, item
必须是 float
类型,返回的列表将填入 float
类型的值。是的,“必须”这个词着实强硬。直到Python 3.7为止,类型提示还不会影响Python程序的运行。它还真的只是提示而非必须。在运行的时候,Python程序可以完全忽略其类型提示,打破其预设的所有约束。不过在开发阶段,类型检查工具可以对程序中的类型提示进行测评,并告诉程序员是否存在函数的违规调用。在程序上线投产以前,调用 repeat("hello", 30)
就能被发现(因为 "hello"
不是 float
类型)。
下面再来看一个例子。这次我们将检查变量声明中的类型提示:
myStrs: List[str] = repeat(4.2, 2)
上述类型提示没有意义。它标注了 myStrs
应该是一个字符串列表。但我们从之前的类型提示可以得知, repeat()
返回的是一个浮点数列表。因为直至3.7版,Python在运行期间尚不会验证类型提示的正确性,这种错误的类型提示对程序的运行不会有任何影响。当然无论是程序员的差错还是对类型的误解,在它酿成大祸之前,类型检查程序都可以将其捕获。