这篇我们介绍实际我们如何有效的使用类型提示,属于实战篇了,从基本的讲起,一步步深入。
类型提示的基本构建块是基本的 Python 类型,这些很容易实现,并立即使我们的代码更明确其期望:
def calculate_age(birth_year: int) -> int: return 2024 - birth_yeardef is_valid_username(name: str) -> bool: return len(name) >= 3 and name.isalnum()def get_price(amount: float, discount: float = 0.0) -> float: return amount * (1 - discount)这些简单的注释会立即告诉其他开发人员每个函数期望和返回的数据类型.
在编程中,某些变量可能有值,也可能是 None(空值),这样的情况非常常见,在早期的 Python 版本中,我们通常使用 Optional(来自 typing 模块)来表示这一点。
然而,在 Python 3.10+ 版本中,引入了更简洁的写法——使用 |(管道运算符) 代替 Optional,让代码更直观。
from typing import Optional# 3.9版本def get_user(user_id: Optional[int]) -> Optional[dict]: if user_id is None: return None return {"id": user_id, "name": "John"}# Python 3.10+def get_user(user_id: int | None) -> dict | None: if user_id is None: return None return {"id": user_id, "name": "John"}Optional[T]实际上只是 的简写,现在使用语法可以更优雅地表示两者, Union[T, None]|
此模式在以下情况下特别有用:
当你在代码中使用 list、dict、set 等集合类型时,类型提示的强大之处就真正体现出来了。
它不仅可以告诉 Python 变量的类型,还可以精确说明集合内部的内容。
def process_orders(orders: list[dict[str, float]]) -> float: return sum(order['amount'] for order in orders)def get_user_stats(user_id: int) -> tuple[str, int, float]: # Returns (username, total_orders, average_order_value) return ('user123', 50, 29.99)def find_user(email: str) -> dict[str, any] | None: # Returns None if user not found return database.get_user(email)集合类型提示的美妙之处在于,它们会创建一个明确的约定 —— 它们会准确地告诉你预期的数据结构是什么,你看到时,就会知道正在获得一个字典列表,其中键是字符串,值是浮点数。
使用类型时,经常会遇到值可能是多种类型之一的情况,这就是类型派上用场的地方。
from typing import Union# Python 3.10+ syntaxdef process_identifier(id: int | str) -> str: # Can handle both numeric IDs and string IDs return str(id).upper()# Pre-3.10 syntaxdef process_identifier_old(id: Union[int, str]) -> str: return str(id).upper()有时,我们需要在类型提示中具有更大的灵活性, 就可以使用Any。
from typing import Anydef store_metadata(key: str, value: Any) -> None: # Can store any type of value database.set(key, value)不过Any应该谨慎使用 —— 它本质上是告诉类型检查器 “根本不检查这个”,所以使用了这个,等于没有类型提示。
以上就是python类型提示的基本用法,属于基础入门型,下次写代码尝试下吧

长按或扫描下方二维码,免费获取 Python公开课和大佬打包整理的几百G的学习资料,内容包含但不限于Python电子书、教程、项目接单、源码等等
▲扫描二维码-免费领取
推荐阅读
写出更优雅的代码:搞懂 Python 协议与抽象基类的核心区别
FastAPI 也能可视化搭建?试试这款神器 FastAPI Forge!
点击 阅读原文了解更多