dataclass 和 Pydantic BaseModel 的核心区别是什么?
🔍 它俩虽然都能“省掉写 init”,但核心区别在于运行时对数据的控制力,一个完全信任你,一个会严格验票。
from dataclasses import dataclass
from pydantic import BaseModel
# 1️⃣ dataclass:纯粹的 Python 数据容器
@dataclass
class UserDC:
name: str
age: int
# 2️⃣ Pydantic:带“安检”的强类型模型
class UserPD(BaseModel):
name: str
age: int
⚡ 核心分歧¶
🧪 同样不靠谱的输入,结局完全不同¶
# dataclass:照单全收,类型只是个装饰
u1 = UserDC(name="Alice", age="not-a-number")
print(u1.age) # "not-a-number",完全不管
# Pydantic:当场翻脸
try:
u2 = UserPD(name="Bob", age="not-a-number")
except Exception as e:
print(e)
# 1 validation error: age: value is not a valid integer
🧩 一个简单的实战对照¶
# Pydantic 对“脏数据”的转换能力
class Product(BaseModel):
price: float
p = Product(price="19.99")
print(p.price) # 19.99 (float)
# dataclass 得自己动手
@dataclass
class ProductDC:
price: float
p2 = ProductDC(price="19.99")
print(p2.price) # "19.99" (str) – 埋雷
💡 所以怎么选?¶
一句话总结:dataclass 是“打包工人”,Pydantic 是“带安检的快递柜”。数据需要“消毒”还是“裸奔”,看它从哪来、要去哪。