Python 类型提示高级应用指南
1. 类型提示基础
类型提示是 Python 3.5+ 引入的特性,它允许我们为变量、函数参数和返回值指定类型。
# 基本类型提示
def greet(name: str) -> str:
return f"Hello, {name}!"
# 变量类型提示
age: int = 30
name: str = "Alice"
# 调用函数
result: str = greet(name)
print(result)
2. 高级类型提示
2.1 复合类型
from typing import List, Tuple, Dict, Set
# 列表类型
def process_numbers(numbers: List[int]) -> List[int]:
return [n * 2 for n in numbers]
# 元组类型
def get_coordinates() -> Tuple[float, float]:
return (1.0, 2.0)
# 字典类型
def get_user() -> Dict[str, str]:
return {"name": "Alice", "email": "alice@example.com"}
# 集合类型
def get_unique_numbers() -> Set[int]:
return {1, 2, 3, 4, 5}
2.2 可选类型
from typing import Optional
def greet(name: Optional[str] = None) -> str:
if name is None:
return "Hello, Guest!"
return f"Hello, {name}!"
# 调用函数
print(greet()) # 输出: Hello, Guest!
print(greet("Alice")) # 输出: Hello, Alice!
2.3 联合类型
from typing import Union
def process_value(value: Union[int, str]) -> str:
if isinstance(value, int):
return f"Integer: {value}"
return f"String: {value}"
# 调用函数
print(process_value(42)) # 输出: Integer: 42
print(process_value("hello")) # 输出: String: hello
2.4 泛型类型
from typing import TypeVar, Generic
T = TypeVar('T')
class Stack(Generic[T]):
def __init__(self):
self.items: List[T] = []
def push(self, item: T) -> None:
self.items.append(item)
def pop(self) -> Optional[T]:
if not self.items:
return None
return self.items.pop()
# 使用泛型栈
int_stack = Stack[int]()
int_stack.push(1)
int_stack.push(2)
print(int_stack.pop()) # 输出: 2
string_stack = Stack[str]()
string_stack.push("hello")
string_stack.push("world")
print(string_stack.pop()) # 输出: world
3. 类型别名
from typing import Dict, List, TypeAlias
# 类型别名
UserId: TypeAlias = int
UserDict: TypeAlias = Dict[str, str]
UserList: TypeAlias = List[UserDict]
def get_users() -> UserList:
return [
{"id": "1", "name": "Alice"},
{"id": "2", "name": "Bob"}
]
# 使用类型别名
users: UserList = get_users()
for user in users:
print(user)
4. 实际应用场景
4.1 函数参数和返回值类型
from typing import List, Dict, Optional
def calculate_average(numbers: List[float]) -> float:
"""计算平均值"""
if not numbers:
return 0.0
return sum(numbers) / len(numbers)
def get_user_by_id(user_id: int) -> Optional[Dict[str, str]]:
"""根据 ID 获取用户"""
users = {
1: {"id": "1", "name": "Alice"},
2: {"id": "2", "name": "Bob"}
}
return users.get(user_id)
# 调用函数
numbers = [1.0, 2.0, 3.0, 4.0, 5.0]
average = calculate_average(numbers)
print(f"Average: {average}")
user = get_user_by_id(1)
print(f"User: {user}")
4.2 类属性和方法类型
from typing import List, Optional
class User:
def __init__(self, id: int, name: str, email: Optional[str] = None):
self.id: int = id
self.name: str = name
self.email: Optional[str] = email
def get_info(self) -> str:
"""获取用户信息"""
if self.email:
return f"{self.name} ({self.email})"
return self.name
class UserManager:
def __init__(self):
self.users: List[User] = []
def add_user(self, user: User) -> None:
"""添加用户"""
self.users.append(user)
def get_user_by_id(self, user_id: int) -> Optional[User]:
"""根据 ID 获取用户"""
for user in self.users:
if user.id == user_id:
return user
return None
# 使用类
user1 = User(1, "Alice", "alice@example.com")
user2 = User(2, "Bob")
manager = UserManager()
manager.add_user(user1)
manager.add_user(user2)
user = manager.get_user_by_id(1)
if user:
print(user.get_info())
4.3 类型检查
使用 mypy 工具可以进行类型检查。
# 安装 mypy
# pip install mypy
# 运行类型检查
# mypy example.py
# 类型错误示例
def greet(name: str) -> str:
return f"Hello, {name}!"
# 错误:类型不匹配
greet(42) # mypy 会报错
4.4 类型注解和文档
from typing import List, Dict, Optional
def process_data(data: List[Dict[str, str]]) -> Optional[List[Dict[str, str]]]:
"""
处理数据
Args:
data: 输入数据列表
Returns:
处理后的数据列表,若输入为空则返回 None
"""
if not data:
return None
# 处理数据
processed = []
for item in data:
if "name" in item:
item["name"] = item["name"].capitalize()
processed.append(item)
return processed
# 调用函数
data = [
{"name": "alice", "email": "alice@example.com"},
{"name": "bob", "email": "bob@example.com"}
]
result = process_data(data)
print(result)
5. 最佳实践
6. 总结
类型提示是 Python 中一种强大的特性,它允许我们为代码添加类型信息,提高代码的可读性、可维护性和可靠性。通过掌握类型提示的高级应用,我们可以编写更加健壮、可维护的代码。
在实际应用中,类型提示可以用于函数参数和返回值、类属性和方法、模块级变量等多种场景,大大提高代码的质量和可维护性。
希望本文对你理解和应用 Python 类型提示有所帮助!
