Python 类型注解(Type Annotations)是从Python 3.5 版本开始引入的一项特性,它允许开发者为变量、函数参数、返回值等提供类型提示。类型注解不会改变程序的实际运行行为,但能提高代码的可读性和便于静态分析工具、IDE 提供更好的代码补全和错误检查支持。Python 的类型注解使用类型提示(typing 模块)来实现。
变量类型注解:
name: str = "Alice" # name 是一个字符串类型
age: int = 30 # age 是一个整数类型
函数参数和返回值类型注解:
from typing import List, Tuple
def greet(name: str) -> str: # name 参数是字符串类型,函数返回值也是字符串
return f"Hello, {name}"
def add_numbers(a: int, b: int) -> int: # a 和 b 都是整数类型,返回值也是整数
return a + b
def process_data(data: List[int]) -> Tuple[int, str]: # data 是整数列表,返回值是一个元组,第一个元素是整数,第二个是字符串
total = sum(data)
return total, "Processed"
类型别名:
UserId = NewType('UserId', int) # 创建一个新的类型别名,表示用户ID
def get_user_info(user_id: UserId): # 使用类型别名作为参数类型
...
自定义类作为类型注解:
class User:
def __init__(self, name: str, age: int):
self.name = name
self.age = age
def print_user_info(user: User): # 使用自定义类作为参数类型
print(f"Name: {user.name}, Age: {user.age}")
Union:表示参数可以是多种类型之一。
from typing import Union
def calculate(a: Union[int, float], b: Union[int, float]) -> float:
return a + b
Optional:表示参数可以是某类型或None。
from typing import Optional
def find_user(id: int) -> Optional[User]:
# 如果找不到用户,返回None
...
Any:可以是任意类型,一般尽量避免使用。
Dict、List、Tuple、Set 等容器类型,可以指定元素的类型。
类型注解进阶使用
对于类的方法和属性,也可以使用类型注解来指定它们的类型或返回类型。这包括实例方法、静态方法和类方法。
from typing import ClassVar, Type
class Book:
title: ClassVar[str] # 类变量,所有实例共享,类型为字符串
author: str # 实例变量,每个实例独立,类型为字符串
def __init__(self, title: str, author: str):
self.title = title
self.author = author
def get_summary(self) -> str: # 返回类型为字符串
return f"{self.title} by {self.author}"
@classmethod
def from_dict(cls: Type['Book'], data: dict) -> 'Book': # 类方法,cls指代类本身,返回类型为Book实例
return cls(title=data['title'], author=data['author'])
协议与抽象基 3.8 引入了协议(Protocol),它是类型提示中的一种抽象基类,用于定义接口规范,而不需要继承。
from typing import Protocol
class 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 Any
def 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