Python 类型标注 小结

众所周知,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 开始支持。它通过把变量类型写在等号前面,大幅增加了存在感,并可以处理“别人写的代码”。

其他

Python 3.8 还增加了更多类似的支持,如 PEP 544、PEP 586、PEP 589、PEP 591。由于没有用过 3.8,这里就不介绍了。总的方向还是不变的,就是增加一些 feature 使动态的语言变得稍微“静态”一点,从而方便开发者、提高安全性。


发表评论

解决 : *
50 − 9 =