众所周知,Python 是动态语言,函数调用不检查传入的变量类型,一个变量的类型现在是数字,下一秒可以变成字符串。这是它的特点(是优点,也是缺点)。
IDE 的代码提示依赖于对变量类型的了解,它大大提升了我的编码体验。
Python 3 之后,增加了多种类型标注的支持。本文主要是给自己备忘,哪一个版本可以用哪些类型标注。
PEP 484
def greeting(name: str) -> str: return 'Hello ' + name
PEP 484 由 Python 3.5 开始支持。通过定义函数参数的类型与函数返回值的类型,可以覆盖大部分“自己写的代码”的情况。
typing
from typing import List Vector = List[float] def scale(scalar: float, vector: List[float]) -> Vector: return [scalar * num for num in vector] # 或 def scale(scalar: float, vector: Vector) -> Vector: return [scalar * num for num in vector] new_vector = scale(2.0, [1.0, -4.2, 5.4])
typing 模块也是由 Python 3.5 开始支持。增加了类似List<String>
、类型别名、泛型等功能。
PEP 526
primes: List[int] = [] captain: str # Note: no initial value! class Starship: stats: ClassVar[Dict[str, int]] = {} some_value: int = other_3rd_party_function()
PEP 526 由 Python 3.6 开始支持。它通过把变量类型写在等号前面,大幅增加了类型的存在感,并可以标注“别人写的代码”返回的类型。
PEP 585
PEP 585 由 Python 3.9 开始支持。之前from typing import List
这样的写法,相当于给 list、dict、set 等类型分别复制了一个大写字母开头的类型,不太方便。所以在 3.9 版本,改为直接用小写的即可。
其他
Python 还增加了更多类似的支持,如 PEP 544、PEP 586、PEP 589、PEP 591 等。总的方向还是不变的,就是增加一些 feature 使动态的语言变得稍微“静态”一点,从而方便开发者、提高安全性。
发表评论