
Python 类型注解(Type Annotations)是从Python 3.5 版本开始引入的一项特性,它允许开发者为变量、函数参数、返回值等提供类型提示。类型注解不会改变程序的实际运行行为,但能提高代码的可读性和便于静态分析工具、IDE 提供更好的代码补全和错误检查支持。Python 的类型注解使用类型提示(typing 模块)来实现。


变量类型注解:
name: str = "Alice" # name 是一个字符串类型age: int = 30 # age 是一个整数类型
函数参数和返回值类型注解:
from typing import List, Tupledef greet(name: str) -> str: # name 参数是字符串类型,函数返回值也是字符串return f"Hello, {name}"def add_numbers(a: int, b: int) -> int: # a 和 b 都是整数类型,返回值也是整数return a + bdef process_data(data: List[int]) -> Tuple[int, str]: # data 是整数列表,返回值是一个元组,第一个元素是整数,第二个是字符串total = sum(data)return total, "Processed"


类型别名:
UserId = NewType('UserId', int) # 创建一个新的类型别名,表示用户IDdef get_user_info(user_id: UserId): # 使用类型别名作为参数类型...
自定义类作为类型注解:
class User:def __init__(self, name: str, age: int):self.name = nameself.age = agedef print_user_info(user: User): # 使用自定义类作为参数类型print(f"Name: {user.name}, Age: {user.age}")


Union:表示参数可以是多种类型之一。
from typing import Uniondef calculate(a: Union[int, float], b: Union[int, float]) -> float:return a + b
Optional:表示参数可以是某类型或None。
from typing import Optionaldef find_user(id: int) -> Optional[User]:# 如果找不到用户,返回None...Any:可以是任意类型,一般尽量避免使用。Dict、List、Tuple、Set 等容器类型,可以指定元素的类型。

类型注解进阶使用

对于类的方法和属性,也可以使用类型注解来指定它们的类型或返回类型。这包括实例方法、静态方法和类方法。
from typing import ClassVar, Typeclass Book:title: ClassVar[str] # 类变量,所有实例共享,类型为字符串author: str # 实例变量,每个实例独立,类型为字符串def __init__(self, title: str, author: str):self.title = titleself.author = authordef get_summary(self) -> str: # 返回类型为字符串return f"{self.title} by {self.author}"@classmethoddef from_dict(cls: Type['Book'], data: dict) -> 'Book': # 类方法,cls指代类本身,返回类型为Book实例return cls(title=data['title'], author=data['author'])


协议与抽象基 3.8 引入了协议(Protocol),它是类型提示中的一种抽象基类,用于定义接口规范,而不需要继承。
from typing import Protocolclass Flyable(Protocol):def fly(self) -> None:...class Bird:def fly(self) -> None:print("Flying high!")class Airplane:def fly(self) -> None:print("Taking off!")def make_it_fly(obj: Flyable) -> None:obj.fly()bird = Bird()airplane = Airplane()make_it_fly(bird) # 正确make_it_fly(airplane) # 正确


有时你可能想明确地忽略某些参数的类型检查,可以使用Any或typing.TYPE_CHECKING。
from typing import Anydef legacy_function(data: Any) -> None: # data的类型不做检查...def complex_function(a, *, kwarg: str = "default") -> None: # kwarg有默认值,但类型注解不影响函数签名...


Mypy:是最流行的静态类型检查器,可以安装在开发环境中,帮助找出类型错误。
Pyright:Visual Studio Code 中的插件,提供了实时的类型检查和代码补全。
PyCharm:集成开发环境,内置了对类型注解的强大支持。


通过这些工具和实践,类型注解不仅能提高个人编码效率,也能提升团队协作的代码质量,减少因类型错误导致的Bug。不过,合理使用类型注解,避免过度注解导致代码可读性下降,保持代码的简洁与清晰是关键。

原创文章,作者:guozi,如若转载,请注明出处:https://www.sudun.com/ask/88949.html