2.17. 类型提示

Python 允许你为函数的形参和返回值标注类型信息。这些标注在运行时被忽略——没有任何东西会检查它们,也没有任何东西会基于它们进行转换——但它们可以作为面向读者和 IDE 的文档。

2.17.1. 标注语法

形参标注放在冒号之后。返回类型放在 -> 之后、函数体冒号之前:

def greet(name: str) -> None:
    print("hello,", name)

def add(a: int, b: int) -> int:
    return a + b

def average(values: list) -> float:
    return sum(values) / len(values)

这些提示描述了应当传入什么以及将会返回什么。调用 add("hi", "there") 并不会引发错误——Python 仍然会运行函数体。这些提示是一份约定,而不是一项检查。

一个形参可以同时拥有默认值和标注:

def greet(name: str, greeting: str = "hello") -> None:
    print(greeting, name)

CPython 通过 typing 模块拥有更丰富的表示法(OptionalUnion、泛型),但这些在 MicroPython 上比较重,而且在日常摄像头代码中很少需要。

2.17.2. 运行时的 MicroPython

MicroPython 会解析标注然后忽略它们。摄像头上没有可供导入的 typing 模块;尝试使用 Optional[int]list[int] 要么会导入失败,要么会静默地表现为普通的属性访问,具体取决于固件构建版本。

在标注中坚持使用普通的类型名称(intfloatstrboolbyteslisttupledict)。它们在运行时不产生任何开销,并能清晰地传达意图。

2.17.3. IDE 如何使用它们

IDE 会读取标注来驱动工具提示、自动补全和内联提示。一个标注为 -> int 的函数,在光标悬停于调用处时会将 int 显示为其返回类型。一个标注为 : str 的形参,会在函数体内对该实参自动补全字符串方法。

这就是在一个忽略标注的运行时上编写标注的实际回报:编辑器提供更好的支持,而当脚本在摄像头上运行时却毫无开销。

2.17.4. 变量标注

对普通赋值的标注以同样的方式工作:

threshold: float = 0.5
name: str = "OpenMV"

这些同样在运行时被忽略。它们的主要用途是在右侧值不能明显表明意图时,使预期的类型一目了然——通常是当初始值是一个稍后将被替换的占位符时。