Pydantic:dataclass与BaseModel的区别

56

Pydantic的dataclass和BaseModel使用的优缺点是什么?是否存在性能问题?在其他Python模块中,使用Pydantic的dataclass更容易还是BaseModel更容易?


我已经实现了纯数据类的验证:https://github.com/EvgeniyBurdin/validated_dc - Evgeniy_Burdin
我必须说,dataclass 比 pydantic 版本(可能适用于更大的项目)更简单(更方便)的结构。. . . https://youtube.com/live/0lCIkY32AdI?feature=share - undefined
3个回答

41

您的问题在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可能更适合您。


10

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

4
__repr__是相同的,但__str__是不同的。我无法在评论中发布代码块,但可以尝试使用print(repr(f))print(f) == print(str(f)) - M.Vanderlee

1
另一个选择是仅使用模型生成来使用openapi-json-schema-generator。它允许针对 openapi/json 模式对许多 Python 数据类型进行强大的验证。
生成 Python 代码,用于根据 OpenAPI 模式验证有效载荷。生成适用于任何 JSON 模式类型的 Python 类,包括未定义类型。这些类型包括未定义类型、null、map、list、number、boolean 和 string。可以接受 Python dict/list/tuple/frozendict/None/bool/int/float/uuid/date/datetime/decimal/bytes/file。模式实例也可以包含字节和文件数据。使用 JSON 模式测试套件生成许多用例测试。您可以在此处查看所有这些测试: https://github.com/openapi-json-schema-tools/openapi-json-schema-generator/tree/master/samples/openapi3/client/3_0_3_unit_test/python/test。目前测试了 24 个 JSON 模式关键字。在一个模式中,允许将 JSON 模式关键字组合在一起,如 oneOf/properties/anyOf/format。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接