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 模块拥有更丰富的表示法(Optional、Union、泛型),但这些在 MicroPython 上比较重,而且在日常摄像头代码中很少需要。
2.17.2. 运行时的 MicroPython¶
MicroPython 会解析标注然后忽略它们。摄像头上没有可供导入的 typing 模块;尝试使用 Optional[int] 或 list[int] 要么会导入失败,要么会静默地表现为普通的属性访问,具体取决于固件构建版本。
在标注中坚持使用普通的类型名称(int、float、str、bool、bytes、list、tuple、dict)。它们在运行时不产生任何开销,并能清晰地传达意图。
2.17.3. IDE 如何使用它们¶
IDE 会读取标注来驱动工具提示、自动补全和内联提示。一个标注为 -> int 的函数,在光标悬停于调用处时会将 int 显示为其返回类型。一个标注为 : str 的形参,会在函数体内对该实参自动补全字符串方法。
这就是在一个忽略标注的运行时上编写标注的实际回报:编辑器提供更好的支持,而当脚本在摄像头上运行时却毫无开销。
2.17.4. 变量标注¶
对普通赋值的标注以同样的方式工作:
threshold: float = 0.5
name: str = "OpenMV"
这些同样在运行时被忽略。它们的主要用途是在右侧值不能明显表明意图时,使预期的类型一目了然——通常是当初始值是一个稍后将被替换的占位符时。