Python 中类型别名和 NewType
Python typing 模块中 TypeAlias 和 NewType 有什么区别?如何定义类型别名?
回答
Yahuda
类型别名:创建类型的别名,只是语义上的提示。
from typing import TypeAlias, NewType
# 类型别名(Python 3.10+ 使用 TypeAlias)
Vector: TypeAlias = list[float]
# 等价于:Vector = list[float]
def move(v: Vector) -> Vector:
return [x + 1 for x in v]
NewType:创建新类型(运行时只是函数调用,类型检查时视为不同类型)。
UserID = NewType('UserID', int)
UserName = NewType('UserName', str)
user_id: UserID = UserID(12345) # 运行时就是 int
name: UserName = UserName('Alice')
def get_user(uid: UserID) -> str:
return f'User {uid}'
# 类型检查会拒绝:
get_user(123) # 类型错误,需要 UserID 而不是 int
区别:
- 类型别名:可互换(
Vector和list[float]等价) - NewType:不可互换(类型检查时强制区分)