Pydantic的dataclass和BaseModel使用的优缺点是什么?是否存在性能问题?在其他Python模块中,使用Pydantic的dataclass更容易还是BaseModel更容易?
您的问题在Pydantic的文档中有解答,具体来说:
请注意,
pydantic.dataclasses.dataclass
是带有验证功能的dataclasses.dataclass
的即插即用替代品,而不是pydantic.BaseModel
的替代品(初始化钩子的工作方式略有不同)。在某些情况下,子类化pydantic.BaseModel
可能是更好的选择。有关更多信息和讨论,请参见samuelcolvin/pydantic#710。
讨论链接将为您提供所需的一些上下文。总的来说,Pydantic的BaseModel
实现并不受Python的dataclass
实现的约束。上述问题中引用的示例就是一个很好的例子:
from pydantic import BaseModel
from pydantic.dataclasses import dataclass
from typing import List
@dataclass
class A:
x: List[int] = []
# Above definition with a default of `[]` will result in:
# ValueError: mutable default <class 'list'> for field x is not allowed: use default_factory
# If you resolve this, the output will read as in the comments below.
class B(BaseModel):
x: List[int] = []
print(A(x=[1, 2]), A(x=[3, 4])) # Output: A(x=[1, 2]) A(x=[3, 4])
print(B(x=[1, 2]), B(x=[3, 4])) # Output: x=[1, 2] x=[3, 4]
如果你最想要的首先是数据类行为,然后再简单地用一些Pydantic验证功能来增强它,则pydantic.dataclasses.dataclass
方法可能是你想要的。否则,BaseModel
可能更适合您。
BaseModel
的 __repr__
字符串表示函数与 dataclass
不同:
@dataclass()
class Foo:
number: int
class Bar(BaseModel):
number: int
f = Foo(number = 1.4)
b = Bar(number = 1.4)
print(f)
print(b)
输出:
Foo(number=1.4)
number=1
__repr__
是相同的,但__str__
是不同的。我无法在评论中发布代码块,但可以尝试使用print(repr(f))
。print(f) == print(str(f))
。 - M.Vanderlee
dataclass
比 pydantic 版本(可能适用于更大的项目)更简单(更方便)的结构。. . . https://youtube.com/live/0lCIkY32AdI?feature=share - undefined