在 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
,bool
def 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 版本进行开发呢?