Skip to main content

Slot

在 Python 的 typing 模块中,TypeVarNewType 都是为了类型注解而引入的,但它们的目的和用法有所不同。

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)

在这个例子中,UserIDint 类型的一个新别名。虽然 UserIDint 在运行时是等价的,但类型检查器会将它们视为不同的类型。这有助于在静态类型检查时捕获潜在的错误。

总结:

  • TypeVar 用于创建类型变量,主要用于泛型编程。
  • NewType 用于创建类型的别名,用于增加代码的清晰性和安全性,但类型在运行时仍然相同。