Python中的泛型:TypeVar

Python中的泛型:TypeVar

  • 介绍
    • 示例1
    • 示例2

介绍

在Python的类型提示(type hints)中,TypeVar 是用于定义类型变量的工具。类型变量在泛型编程中非常有用,它们允许你定义灵活的函数、类或方法,这些函数、类或方法可以在多种类型上操作,而不仅仅是特定的类型。

TypeVar 允许你定义一个变量,该变量可以代表任何类型或一组类型。然后,你可以使用这个类型变量来定义函数或类的参数和返回类型。

示例1

这里有一个简单的例子,展示了如何使用 TypeVar:

from typing import TypeVar, List  
  
T = TypeVar('T', int, float)  # 定义类型变量 T,它必须是 int 或 float  
  
def sum_items(lst: List[T]) -> T:  
    return sum(lst)  
  
print(sum_items([1, 2, 3]))  # 输出: 6  
print(sum_items([1.0, 2.0, 3.0]))  # 输出: 6.0  
# sum_items(['a', 'b', 'c']) 会导致类型错误,因为字符串不是 int 或 float

在这个例子中,T 是一个类型变量,它必须是 int 或 float 类型。因此,sum_items 函数只能接受整数或浮点数列表,并返回相应类型的总和。

示例2

在Python中,使用TypeVar来定义 Callable[…, Generator | Iterator] 可以让你更具体地描述可调用的对象(如函数或方法)的返回类型,这里返回类型可以是Generator或Iterator。同时,使用TypeVar与Callable结合可以让你更灵活地处理泛型。

前置知识——Callable[…, Generator | Iterator]:

  • Callable: 表示一个可调用的对象。
  • : 表示该函数可以接受任意数量的位置参数。
  • Generator | Iterator: 表示返回类型可以是Generator或Iterator。在Python 3.9及以后的版本中,你可以使用|来表示类型联合。
    前置知识——Callable[…, Generator | Iterator]:

下面是一个如何使用TypeVar来定义Callable[…, Generator | Iterator]的例子:

from typing import Callable, TypeVar, Generator, Iterator, Any  
  
# 定义一个TypeVar,它可以代表任何类型  
T = TypeVar('T')  
  
# 使用TypeVar和Callable定义可调用的对象,其返回类型为Generator或Iterator  
CallableGeneratorOrIterator = Callable[..., Generator[T, None, None] | Iterator[T]]  
  
# 定义一个函数,它接受一个符合CallableGeneratorOrIterator类型的参数  
def process_data(func: CallableGeneratorOrIterator[int]):  
    for item in func():  
        print(item)  
  
# 这是一个生成器函数  
def generate_numbers() -> Generator[int, None, None]:  
    for i in range(5):  
        yield i  
  
# 使用函数  
process_data(generate_numbers)  # 输出: 0 1 2 3 4

在这个例子中,T是一个类型变量,它可以代表任何类型。我们用它来定义CallableGeneratorOrIterator,这个类型表示一个可调用的对象,其返回类型是一个Generator或Iterator,产出元素的类型是T。

process_data函数现在接受一个可调用的对象func,该对象符合CallableGeneratorOrIterator[int]类型,即它应该是一个返回整数类型元素的生成器或迭代器。

在定义CallableGeneratorOrIterator时,我们使用了…作为位置参数的占位符,这表示这个函数可以接受任意数量和类型的位置参数。返回类型部分,我们使用了Generator[T, None, None],T是生成器产出的类型,None是生成器发送的类型(在这里我们不使用发送功能,所以为None),而最后的None表示生成器的返回类型(在正常的生成器函数中,我们通常不返回任何值,所以为None)。

你可能感兴趣的:(python,python,开发语言)