实际注释示例
现实世界中的类型注释场景
数据处理函数
from typing import List, Dict, Optional
def filter_valid_users(users: List[Dict[str, str]]) -> List[Dict[str, str]]:
return [user for user in users if user.get('email')]
def calculate_average(numbers: List[float]) -> Optional[float]:
return sum(numbers) / len(numbers) if numbers else None
API 与网络交互
from typing import Union, Dict, Any
def fetch_api_data(endpoint: str) -> Union[Dict[str, Any], None]:
try:
## 模拟 API 请求
return {"status": "success", "data": [1, 2, 3]}
except Exception:
return None
错误处理与类型注释
from typing import Tuple, Union
def divide_numbers(a: float, b: float) -> Union[float, str]:
try:
return a / b
except ZeroDivisionError:
return "Division by zero error"
注释策略比较
场景 |
返回类型 |
注释策略 |
复杂度 |
简单计算 |
数值型 |
直接类型 |
低 |
数据过滤 |
列表 |
泛型类型 |
中等 |
错误处理 |
联合类型 |
多种可能返回值 |
高 |
类型注释流程
graph TD
A[函数输入] --> B{处理数据}
B --> C{验证返回值}
C --> |有效类型| D[返回带注释的结果]
C --> |类型不匹配| E[引发类型错误]
高级注释技术
from typing import Callable, TypeVar
T = TypeVar('T')
R = TypeVar('R')
def apply_transform(
data: List[T],
transformer: Callable[[T], R]
) -> List[R]:
return [transformer(item) for item in data]
装饰器类型注释
from typing import Callable, Any
def log_return(func: Callable[..., Any]) -> Callable[..., Any]:
def wrapper(*args: Any, **kwargs: Any) -> Any:
result = func(*args, **kwargs)
print(f"函数返回: {result}")
return result
return wrapper
@log_return
def example_function(x: int) -> str:
return str(x * 2)
最佳实践
- 使用精确的类型注释
- 处理潜在的边界情况
- 利用 typing 模块的功能
- 考虑运行时类型验证
LabEx 洞察
在 LabEx Python 环境中探索复杂的类型注释场景,以提升你的类型提示技能。
常见挑战
- 平衡类型特异性和灵活性
- 管理复杂的返回类型场景
- 保持类型提示的可读性
- 与现有代码库集成