从Python 3.5开始,typing
模块被引入以支持静态类型注解。这些注解主要用于文档和类型检查,但它们在运行时不会被强制执行(除了少数几个特殊类型,如typing.NewType
)。不过,有一些第三方工具,如mypy
,可以利用这些注解来执行静态类型检查。
以下是一些typing
模块中常用的类型注解的示例:
- 基本类型
from typing import List, Dict, Tuple, Set
def greet(name: str) -> str:
return f"Hello, {name}!"
def calculate_sum(numbers: List[int]) -> int:
return sum(numbers)
def get_user_data(user_id: int) -> Tuple[str, int]:
# 假设这是从某个地方获取的用户数据
return "John Doe", 30
def count_items(items: Dict[str, int]) -> int:
return sum(items.values())
def unique_items(items: Set[str]) -> Set[str]:
return items # 假设我们直接返回原始集合
- 可选参数和返回值
from typing import Optional
def find_user(user_id: int, cache: Optional[Dict[int, str]] = None) -> Optional[str]:
if cache and user_id in cache:
return cache[user_id]
# 假设这里有一个查找用户的逻辑
# ...
return None # 如果没有找到用户,返回None
- 泛型
from typing import TypeVar, Generic, List
T = TypeVar('T') # 声明一个泛型变量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) -> T:
return self.items.pop()
def empty(self) -> bool:
return not bool(self.items)
- 类型别名
from typing import NewType
UserId = NewType('UserId', int)
def get_user_by_id(user_id: UserId) -> str:
# 假设这是一个获取用户名的函数
# 注意:虽然UserId在运行时是int,但它为代码提供了更多的上下文
return f"User with ID: {user_id}"
- 使用第三方库进行类型检查
安装mypy
并执行类型检查:
pip install mypy
mypy your_script.py
注意:虽然类型注解对于提高代码质量和可读性非常有用,但Python仍然是一种动态类型的语言,因此这些注解在运行时不会强制执行。它们主要用于文档和工具(如mypy
)中的静态类型检查。