我是一筐橙子头像
关注
Python 类型提示入门:FastAPI 开发者的必修课封面图

Python 类型提示入门:FastAPI 开发者的必修课

本文基于 FastAPI 官方文档《Python 类型提示简介》整理编写,帮助初学者快速理解 Python 类型注解的核心概念及其在 FastAPI 中的实际应用。


什么是类型提示?

Python 从 3.5 版本开始支持类型提示(Type Hints),也叫类型注解。它是一种可选的特殊语法,用来声明变量或函数参数的类型。它的核心价值在于让编辑器和开发工具更好地理解你的代码,从而提供智能补全和类型检查。

FastAPI 的整个框架都建立在 Python 类型提示之上 —— 这是它最显著的特点:你不需要学习任何新的语法或框架特定的写法,只需要标准的现代 Python 即可。


动机:为什么需要类型提示?

假设你正在从头编写一个简单的函数:

def get_full_name(first_name, last_name):
    full_name = first_name.title() + " " + last_name.title()
    return full_name

当你输入 first_name. 然后按下 Ctrl+Space 尝试触发自动补全时,编辑器一脸茫然 —— 它不知道 first_name 是什么类型,自然也没办法告诉你有哪些方法可以调用。你只能凭记忆去猜是 upperuppercasecapitalize 还是 title

现在我们给参数加上类型提示:

def get_full_name(first_name: str, last_name: str):
    full_name = first_name.title() + " " + last_name.title()
    return full_name

改动只有一个:在参数后加上 : str。就这么一行改动,编辑器立刻"聪明"了起来。再次按下 Ctrl+Space,所有字符串相关的方法都会出现在补全列表中。这就是类型提示最直观的价值 —— 更好的编辑器体验

还有一个更实用的例子:

def get_name_with_age(name: str, age: int):
    name_with_age = name + " is this old: " + age  # 编辑器会标红这里!
    return name_with_age

因为编辑器知道 ageint 类型,而 namestr 类型,它会立刻提醒你:不能直接用 + 拼接字符串和整数。你需要改成 str(age) 才能正确运行。这就是类型提示的另一个核心价值 —— 及早发现错误


基础类型声明

Python 支持所有标准类型的声明:

def get_items(
    item_a: str,      # 字符串
    item_b: int,      # 整数
    item_c: float,    # 浮点数
    item_d: bool,     # 布尔值
    item_e: bytes,    # 二进制数据
):
    return item_a, item_b, item_c, item_d, item_e

这些类型名本身就是 Python 内置的,不需要额外导入,写起来非常自然。


泛型类型:让容器也带上类型

Python 的容器类型(listtuplesetdict)可以进一步声明"里面装的是什么类型",这被称为泛型。写法是把内部类型放在方括号 [] 中。

列表

def process_items(items: list[str]):
    for item in items:
        print(item)  # 编辑器知道 item 是 str

这表示 items 是一个列表,里面的每个元素都是字符串。当你遍历时,编辑器也知道 item 的类型是 str,会给出字符串方法的补全。

元组和集合

def process_items(
    items_t: tuple[int, int, str],   # 三元组:两个 int 加一个 str
    items_s: set[bytes],             # 每个元素都是 bytes 的集合
):
    return items_t, items_s

tuple 的泛型写法可以指定每个位置的具体类型,而 set 只需要指定一个类型(因为集合中所有元素类型相同)。

字典

def process_items(prices: dict[str, float]):
    for item_name, item_price in prices.items():
        print(item_name)   # 编辑器知道是 str
        print(item_price)  # 编辑器知道是 float

字典需要两个类型参数:第一个是键的类型,第二个是值的类型。dict[str, float] 表示键是字符串、值是浮点数的字典。


联合类型:一个变量可以有两种类型

有些情况下,一个变量可能是 int 也可能是 str。用竖线 | 连接两个类型即可:

def process_item(item: int | str):
    print(item)

这被称为联合类型,表示 item 可以是 intstr 中的任意一种。

在 FastAPI 里最常见的联合类型用法是可选参数

def say_hi(name: str | None = None):
    if name is not None:
        print(f"Hey {name}!")
    else:
        print("Hello World")

str | None 表示 name 可以是字符串,也可以是 None。配合 = None 作为默认值,这个参数就变成了可选的。FastAPI 中大量使用了这种模式来定义可选的查询参数。


类也可以作为类型

不仅基础类型,你自定义的类也可以直接用作类型提示:

class Person:
    def __init__(self, name: str):
        self.name = name

def get_person_name(one_person: Person):
    return one_person.name  # 编辑器知道 Person 有 name 属性

当编辑器看到 one_person: Person,它会知道这个变量是 Person 类的实例,从而提供 name、以及其他属性和方法的自动补全。


Pydantic 模型:类型提示的终极应用

Pydantic 是一个 Python 数据验证库,它将类型提示发挥到了极致。定义一个数据模型,就是声明一个带有类型注解的类:

from datetime import datetime
from pydantic import BaseModel

class User(BaseModel):
    id: int
    name: str = "John Doe"
    signup_ts: datetime | None = None
    friends: list[int] = []

然后你只需要这样使用:

external_data = {
    "id": "123",
    "signup_ts": "2017-06-01 12:22",
    "friends": [1, "2", b"3"],
}
user = User(**external_data)

print(user.id)         # 123 (自动从字符串转成了整数)
print(user.signup_ts)  # datetime.datetime(2017, 6, 1, 12, 22)
print(user.friends)    # [1, 2, 3] (自动转了类型并去重)

Pydantic 会自动完成数据验证、类型转换、默认值填充,并且全程享受编辑器的类型提示支持。FastAPI 完全建立在 Pydantic 之上,你在 FastAPI 里定义的所有请求体、查询参数、响应模型,本质上都是 Pydantic 模型。


类型提示在 FastAPI 中的作用

在 FastAPI 中,用类型提示声明参数,框架会自动帮你完成以下事情:

  1. 数据转换:把请求中的字符串自动转成你声明的 intfloatdatetime 等类型
  2. 数据验证:当数据不符合类型要求时,自动返回清晰的错误信息给客户端
  3. 编辑器支持:全程享受 IDE 的自动补全和类型检查
  4. 自动文档:基于类型声明自动生成 OpenAPI 文档和交互式 API 页面

你用标准的 Python 类型声明一次,FastAPI 就帮你完成所有这些工作 —— 不需要额外的装饰器、配置文件,也不需要学习新的 DSL。


写在最后

类型提示是 Python 生态正在快速普及的一项特性,而 FastAPI 是最能体现其价值的框架之一。即使你暂时不用 FastAPI,学会类型提示也能显著提升日常 Python 开发的效率和质量 —— 代码更清晰、编辑器更智能、bug 更少。

如果你已经准备好动手实践,建议从 FastAPI 的官方教程 - 用户指南开始,那里有大量真实场景下的类型提示应用示例,能帮你快速上手。

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/2401_89111612/article/details/163283815

文章来源crawl

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--