在 Python 中,随着语言的发展,越来越多的类型提示可以直接使用内置类型或在没有显式导入 typing 模块的情况下使用。
不需要引入 typing 的常见写法
从 Python 3.9 及更高版本开始,你可以直接使用内置的集合类型作为泛型类型,而不需要从 typing 模块导入。这得益于 PEP 585 的引入,它极大地简化了类型提示的写法。
1. 内置集合类型作为泛型
这是最主要且最常用的不需要引入 typing 的情况。你可以直接用 list, dict, tuple, set 等作为泛型容器。
-
列表(List):
def process_numbers(numbers: list[int]) -> None: print(f"Processing numbers: {numbers}") process_numbers([1, 2, 3]) -
字典(Dictionary):
def get_user_email(user_info: dict[str, str]) -> str: return user_info.get("email", "N/A") print(get_user_email({"name": "Alice", "email": "alice@example.com"})) -
元组(Tuple):
def get_point() -> tuple[float, float]: return (10.5, 20.5) x, y = get_point() print(f"Point: ({x}, {y})") -
集合(Set):
def unique_names(names: set[str]) -> int: return len(names) print(unique_names({"Alice", "Bob", "Alice"})) -
FrozenSet(不可变集合):
def get_constants() -> frozenset[int]: return frozenset({1, 2, 3}) print(get_constants())
2. 联合类型(Union Types)
从 Python 3.10 及更高版本开始,你可以使用 | 运算符来表示联合类型,而不需要从 typing 模块导入 Union。
-
使用
|运算符:def process_id(identifier: str | int) -> str: return f"ID: {identifier}" print(process_id("user123")) print(process_id(456)) -
表示可选类型(Optional):
Optional[X]等价于Union[X, None],因此在 Python 3.10+ 中,X | None也可以直接使用。def get_data(success: bool) -> str | None: if success: return "Data retrieved" return None print(get_data(True)) print(get_data(False))
3. 类型别名(Type Aliases)
对于自定义的类型别名,你当然不需要导入 typing,因为它们只是你为现有类型定义的名称。
# 定义一个自定义类型别名
UserId = int
Name = str
def greet_user(user_id: UserId, name: Name) -> str:
return f"Hello, user {user_id} named {name}!"
print(greet_user(101, "Charlie"))
4. 内置类型本身
最基本但很容易被忽视的是,当你直接使用 Python 内置类型进行类型提示时,你当然不需要导入任何东西。
-
基本数据类型:
str,int,float,booldef add(a: int, b: int) -> int: return a + b def is_active(status: bool) -> str: return "Active" if status else "Inactive" -
None: 作为返回值或可选参数时直接使用None。def do_something() -> None: print("Done!")
总结
所以,如果你正在使用 Python 3.9 或更高版本,你可以大大简化你的类型提示,特别是对于集合类型和联合类型,使得代码更加简洁和直观。对于旧版本的 Python,你仍然需要从 typing 模块导入相应的类型(例如 List, Dict, Union 等)。
希望这能帮你更好地理解在不同 Python 版本中类型提示的用法!你通常使用哪个 Python 版本进行开发呢?