Slot
在 Python 的 typing
模块中,TypeVar
和 NewType
都是为了类型注解而引入的,但它们的目的和用法有所不同。
TypeVar
TypeVar
是用来创建类型变量的,这些类型变量表示可以替换为其他类型的占位符。它主要用于泛型函数和泛型类,以支持灵活的参数类型。使用 TypeVar
可以确保泛型函数的类型参数在函数的不同部分之间保持一致。
示例:
from typing import TypeVar, List
T = TypeVar('T')
def repeat(x: T, n: int) -> List[T]:
return [x] * n
# 这里 T 可以是任何类型,如 int, str 等
result_int = repeat(3, 5) # List[int]
result_str = repeat('a', 3) # List[str]
在这个例子中,TypeVar('T')
创建了一个名为 T
的类型变量,它可以在函数 repeat
的参数和返回值中使用。
NewType
NewType
是用来创建新类型的别名,这些新类型与原始类型在运行时是等价的,但在类型检查时是不同的。使用 NewType
可以增加代码的清晰性和安全性,因为它允许你为特定上下文中的值定义特定的类型。
示例:
from typing import NewType
UserID = NewType('UserID', int)
def get_user_name(user_id: UserID) -> str:
# 假设有一个根据用户ID获取用户名的函数
# ...
return "User Name"
# 正确的用法
user_id = UserID(123)
get_user_name(user_id)
# 错误的用法,虽然 int 类型在运行时可以赋值给 UserID,但类型检查器会报错
# get_user_name(456) # TypeError: Expected argument of type "UserID" (got "int" instead)
在这个例子中,UserID
是 int
类型的一个新别名。虽然 UserID
和 int
在运行时是等价的,但类型检查器会将它们视为不同的类型。这有助于在静态类型检查时捕获潜在的错误。
总结:
TypeVar
用于创建类型变量,主要用于泛型编程。NewType
用于创建类型的别名,用于增加代码的清晰性和安全性,但类型在运行时仍然相同。