用java的视角打开大模型与python学习02

文章目录

      • [1、入口参数必须经 Pydantic 校验](#1、入口参数必须经 Pydantic 校验)
      • [2、可选字段标注 `OptionalT` 或 `T | None`](#2、可选字段标注 Optional[T]T | None)
      • 3、公开函数必须有类型注解
      • [4、通过 `mypy --strict` 检查](#4、通过 mypy --strict 检查)
      • [5、I/O 操作(数据库、HTTP)必须 `async/await`,不混用同步阻塞调用](#5、I/O 操作(数据库、HTTP)必须 async/await,不混用同步阻塞调用)

1、入口参数必须经 Pydantic 校验

翻译:controller层的入参必须通过继承Pydantic的BaseModel进行格式校验。校验时如果格式不一样先强制转换,转换成功也算正确。

复制代码
from datetime import datetime
from pydantic import BaseModel
# 1. 定义数据模型
class User(BaseModel):
    id: int
    name: str = "John Doe"  # 有默认值,可选
    signup_ts: datetime | None = None  # 允许为None,但如果是字符串会转成datetime
# 2. 外部来的数据,类型有些"不标准"
external_data = {
    'id': '123',  # 这是个字符串!
    'signup_ts': '2026-07-29 12:00',  # 这也是个字符串!
}
# 3. Pydantic自动校验和转换
user = User(**external_data)
print(user.id)          # 输出: 123 (已经是int了)
print(user.signup_ts)   # 输出: 2026-07-29 12:00:00 (已变成datetime对象)

如果需要抛出异常使用对应方法

复制代码
from pydantic import BaseModel, ValidationError
class User(BaseModel):
    id: int
    name: str
# 故意传入错误数据
try:
    user = User(id="abc", name="Alice")  # "abc" 无法转成 int
except ValidationError as e:
    print(e)

如果使用了FastAPI框架,则自动处理异常

复制代码
from fastapi import FastAPI
app = FastAPI()
@app.post("/items/")
async def create_item(item: Item):  # FastAPI 会基于 'Item' 这个注解来校验请求体
    return item

2、可选字段标注 Optional[T]T | None

翻译:可以为空的参数,代码里写明可以为空

复制代码
# ❌ 不标 Optional → 必填
class CreateTaskRequest(BaseModel):
    task_type: str          # 必填,不传 → 422 报错
# ✅ 标 Optional → 可选
class CreateTaskRequest(BaseModel):
    task_type: str                    # 必填
    timeout: int | None = None        # 可选,不传就是 None
    remark: Optional[str] = None      # 同上,老写法

3、公开函数必须有类型注解

翻译:公开可以调用的方法必须写上返回类型和参数类型

复制代码
// Java 每个方法都必须写类型
public UserResponse getUser(Long id) { ... }
//     ↑返回类型        ↑参数类型

# ❌ 禁止
def process(data, flag):
    ...

# ✅ 必须
def process(data: dict, flag: bool) -> ProcessResult:
    ...

4、通过 mypy --strict 检查

翻译

复制代码
javac = 编译 + 类型检查(二合一)
Python 世界:
  python 解释器 ≈ JVM(只运行,不检查类型)
  mypy ≈ 单独的类型检查工具(只检查,不编译)

mypy --strict src/ 是最强的检查,可以通过三种方式进行:

复制代码
方式一:命令行指定参数
mypy --strict src/ 
方式二:配置文件
# pyproject.toml
[tool.mypy]
python_version = "3.12"
strict = true
ignore_missing_imports = true
然后运行:
mypy src/  # 自动读取配置文件
方式三:混合使用
配置文件是基础,命令行参数可以覆盖
mypy --strict src/   # 临时开启 strict,覆盖配置文件
mypy --no-strict-optional src/  # 临时关闭某个检查

5、I/O 操作(数据库、HTTP)必须 async/await,不混用同步阻塞调用

翻译:SpringBoot每个请求开启一个线程;FastAPI一个进程一个线程,每个用户访问进入的是同一个线程,需要在I/O操作时让出线程。生产时可通过配置Worker数量去扩充进程。

相关推荐
传奇开心果编程10 小时前
【Rust入门知识点学与练】第21课:Trait 进阶 Advanced Traits
开发语言·学习·rust
水巷石子10 小时前
备考系统架构设计师第一天
学习·架构·软考·设计·考试
青 春 记 忆10 小时前
零基础入门python70:Docker Compose 编排完整后端
python·后端开发
新时代牛马10 小时前
字符设备驱动完整篇:从 cdev_add、file_operations 到chrdev_open 与排障
开发语言·python
swordbob10 小时前
ReentrantLock 与 AQS 完整学习手册
java·开发语言
是隼人11 小时前
buuctf-pwn inndy_echo(32位fmt)题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
m0_5873830011 小时前
全民健身解决方案软件开发实战:从架构设计到落地指南
java·spring boot·spring·架构·需求分析
白山编程大哥11 小时前
Java OutputStreamWriter 详解:从字符到字节的桥梁
java·开发语言·python
xian_wwq11 小时前
【学习笔记】深度认知系列-第16讲-提示词工程
人工智能·笔记·学习
洛阳纸贵11 小时前
MATLAB-matlab基础知识
学习·算法·matlab