用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数量去扩充进程。

相关推荐
Metaphor6928 小时前
Python 自动化办公:如何轻松在 PDF 中导入与导出表单数据
python·pdf·自动化
凤凰院凶涛QAQ15 小时前
《Java版数据结构 & 集合类剖析》Map & Set & 反射:“从哈希碰撞到红黑树转换,反射帮你扒开 HashMap 的桶数组看个究竟”
java·数据结构·算法
H.莓飛15 小时前
【数据结构】排序_OJ题(一):计数、桶与排序后的处理
java·开发语言·数据结构
wangchunyu11415 小时前
JAVA AQS与Lock实现原理(含CAS)
java·开发语言·word
w_zero_one16 小时前
算法--模拟
java·数据结构·算法
外收内放17 小时前
面向对象高级(实战案例)
开发语言·python·学习
Javatutouhouduan17 小时前
阿里1658页Java面试题总结(含答案)
java·高并发·java面试·java面试题·后端开发·java程序员·java八股文
秋天的怀念_David17 小时前
算法一千零一夜 · 第十三夜 幻方,武侠世界里的数学迷宫
java·程序人生·算法
专业程序开发源17 小时前
springboot欧缇蔓月子中心管理系统82697-计算机课程设计、毕业设计
java·spring boot·后端·python·spring·django·课程设计
FPGA小迷弟17 小时前
用 Claude Code 重构遗留系统:从评估到落地的完整实践指南
c++·python·ai·plotly·django·ai编程·claude