一、Optional和Generic区别
-
用途不同:
Optional
用于表示一个值可能是某种类型,也可能是None
。Generic
用于定义参数化的类或函数,使其能够处理多种数据类型。
-
实现方式:
Optional
实际上是Union[X, None]
的语法糖。Generic
需要与TypeVar
一起使用,定义类型变量以参数化类或函数。
-
使用场景:
- 使用
Optional
的场景是当一个值可能为空(None
)时,明确表示这一点。 - 使用
Generic
的场景是当你需要创建能够处理不同类型数据的通用类或函数时。
- 使用
二、Optional和Generic详细样例:
2.1 Optional
用于表示可能为空的值,是一种简单的类型别名,表示类型 X
或 None:
from typing import Optional
def find_item(index: int) -> Optional[str]:
items = ["apple", "banana", "cherry"]
if 0 <= index < len(items):
return items[index]
return None
# 使用 Optional 明确表示返回值可能是 None
item = find_item(2)
if item:
print(f"Found item: {item}")
else:
print("Item not found")
2.2 Generic
用于创建参数化的类或函数,使其能够处理多种类型的数据,提供了更高的灵活性和重用性:
from typing import TypeVar, Generic, List
T = TypeVar('T') # 定义一个类型变量
class Stack(Generic[T]):
def __init__(self):
self._items: List[T] = []
def push(self, item: T):
self._items.append(item)
def pop(self) -> T:
return self._items.pop()
def is_empty(self) -> bool:
return len(self._items) == 0
# 创建一个整型栈
int_stack = Stack[int]()
int_stack.push(1)
int_stack.push(2)
print(int_stack.pop()) # 输出: 2
# 创建一个字符串栈
str_stack = Stack[str]()
str_stack.push("hello")
str_stack.push("world")
print(str_stack.pop()) # 输出: world