实际标注示例
实际场景:数据处理函数
灵活的数据聚合
from typing import Union, List, Dict, Any
def aggregate_data(*args: Union[int, float],
**kwargs: Dict[str, Any]) -> Dict[str, Union[float, List[Union[int, float]]]]:
result = {
'values': list(args),
'total': sum(args),
'metadata': kwargs
}
if'scale' in kwargs:
result['scaled_total'] = sum(args) * kwargs['scale']
return result
## 使用示例
processed_data = aggregate_data(1, 2, 3, scale=2, source='sensor')
带可变参数的装饰器
from typing import Callable, TypeVar, Any
import functools
T = TypeVar('T')
def log_execution(*args: Any, **kwargs: Any) -> Callable[[T], T]:
def decorator(func: Callable[..., Any]) -> Callable[..., Any]:
@functools.wraps(func)
def wrapper(*func_args: Any, **func_kwargs: Any) -> Any:
print(f"调用 {func.__name__},参数为:{func_args},关键字参数为:{func_kwargs}")
return func(*func_args, **func_kwargs)
return wrapper
return decorator
@log_execution()
def complex_calculation(x: int, y: int, **options: Any) -> int:
multiplier = options.get('multiplier', 1)
return (x + y) * multiplier
事件处理系统
from typing import Callable, Dict, Any, Union
class EventManager:
def __init__(self):
self._handlers: Dict[str, List[Callable[..., Any]]] = {}
def register_handler(self, event_type: str,
*handlers: Callable[..., Any]) -> None:
if event_type not in self._handlers:
self._handlers[event_type] = []
self._handlers[event_type].extend(handlers)
def trigger_event(self, event_type: str,
*args: Any, **kwargs: Any) -> List[Any]:
results = []
for handler in self._handlers.get(event_type, []):
results.append(handler(*args, **kwargs))
return results
类型标注流程可视化
graph TD
A[可变参数] --> B{类型标注}
B --> |*args| C[位置参数]
B --> |**kwargs| D[关键字参数]
C --> E[类型验证]
D --> F[灵活的类型处理]
标注复杂度比较
场景 |
复杂度 |
类型安全性 |
灵活性 |
简单参数 |
低 |
高 |
中等 |
混合类型 |
中等 |
中等 |
高 |
通用类型标注 |
高 |
非常高 |
非常高 |
高级类型标注技术
带可变参数的通用函数
from typing import TypeVar, Callable, Any
T = TypeVar('T')
R = TypeVar('R')
def generic_transformer(
transformer: Callable[[T], R],
*args: T,
**kwargs: Any
) -> List[R]:
return [transformer(arg) for arg in args]
## 示例用法
def double(x: int) -> int:
return x * 2
transformed = generic_transformer(double, 1, 2, 3, 4)
最佳实践
- 使用类型提示以提高清晰度
- 利用
typing
模块的功能
- 在类型安全性和代码可读性之间取得平衡
- 使用像 mypy 这样的静态类型检查器
通过掌握这些实际的标注技术,开发者可以创建更健壮、具有自文档性且更灵活的 Python 代码,并增强类型安全性。