当前位置:嗨网首页>书籍在线阅读

03-类型提示的格式

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

C.2 类型提示的格式

类型提示应该添加到声明变量或函数的代码行中。变量或函数参数的类型提示用冒号“ : ”开始,函数返回值的类型提示用箭头“ -> ”开始。例如,考虑以下Python代码行:

def repeat(item, times):

如果不阅读函数的定义,你能说出这个函数要完成什么功能吗?要把某个字符串打印指定次?还是别的什么功能?当然,通过阅读函数定义可以弄清楚它的功能,但会耗费更多的时间。遗憾的是,该函数的作者没有提供任何注释文档。下面用类型提示再来试一遍:

def repeat(item: Any, times: int) -> List[Any]:

这样就清楚多了。只看类型提示就能明白,该函数以 Any 类型的 item 为参数,并会返回一个填入了 timesitemList 。当然,注释文档仍然有助于让该函数更易于理解,但至少使用该库的用户现在知道了该提供什么类型的值给它,以及它应该返回什么类型的值。

假定该函数要用的库只支持浮点数,并且该函数将用于设置供其他函数使用的列表。要修改类型提示十分简单,只要标明这种浮点数约束即可:

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在运行期间尚不会验证类型提示的正确性,这种错误的类型提示对程序的运行不会有任何影响。当然无论是程序员的差错还是对类型的误解,在它酿成大祸之前,类型检查程序都可以将其捕获。