对 NewType 的 Pydantic 检查
Pydantic Checks on NewType
我为项目创建了一个带有约束的新类型。 (我知道,这个类型本身真的一点都不好,但是现在,就这么用了)
from typing import NewType
from pydantic import conlist, PositiveFloat
PositionType = NewType('PositionType', conlist(PositiveFloat, min_items=2, max_items=2))
如果我创建一个新的错误类型实例,我不会收到任何错误
test = PositionType([2,-4])
但是,如果我创建一个使用此类型的 BaseModel 实例,我会收到预期的错误。
from pydantic import BaseModel
from typing import List
class TestClass(BaseModel):
list_of_positions : List[PositionType]
test = TestClass(list_of_positions=[test])
我希望能够在使用 PositionType 的新实例时检查是否正确创建了新对象。任何想法如何?我找不到 运行 pydantic 的装饰器/选项
(我在 Python3.10)
经过一段时间的研究,我最终得到了这个解决方案:
Pydantic 允许为 classes:
定义自定义根类型
from typing import NewType
from pydantic import conlist, PositiveFloat
from pydantic import BaseModel
PositionType = NewType('PositionType', conlist(PositiveFloat, min_items=2, max_items=2))
class PositionClass(BaseModel):
__root__: PositionType
test = PositionClass.parse_obj([2, -4])
将 __root__
设置为我的新类型时,我得到一个与我的 NewType 基本相同的 class。仅在调用 PositionClass()
时,我需要将 __root__
作为参数传递或使用每个 pydantic class 具有的 parse_obj
函数。
现在我得到了我想要的错误消息(尽管我对必须将 __root__
传递给构造函数并不完全满意)
我为项目创建了一个带有约束的新类型。 (我知道,这个类型本身真的一点都不好,但是现在,就这么用了)
from typing import NewType
from pydantic import conlist, PositiveFloat
PositionType = NewType('PositionType', conlist(PositiveFloat, min_items=2, max_items=2))
如果我创建一个新的错误类型实例,我不会收到任何错误
test = PositionType([2,-4])
但是,如果我创建一个使用此类型的 BaseModel 实例,我会收到预期的错误。
from pydantic import BaseModel
from typing import List
class TestClass(BaseModel):
list_of_positions : List[PositionType]
test = TestClass(list_of_positions=[test])
我希望能够在使用 PositionType 的新实例时检查是否正确创建了新对象。任何想法如何?我找不到 运行 pydantic 的装饰器/选项 (我在 Python3.10)
经过一段时间的研究,我最终得到了这个解决方案: Pydantic 允许为 classes:
定义自定义根类型from typing import NewType
from pydantic import conlist, PositiveFloat
from pydantic import BaseModel
PositionType = NewType('PositionType', conlist(PositiveFloat, min_items=2, max_items=2))
class PositionClass(BaseModel):
__root__: PositionType
test = PositionClass.parse_obj([2, -4])
将 __root__
设置为我的新类型时,我得到一个与我的 NewType 基本相同的 class。仅在调用 PositionClass()
时,我需要将 __root__
作为参数传递或使用每个 pydantic class 具有的 parse_obj
函数。
现在我得到了我想要的错误消息(尽管我对必须将 __root__
传递给构造函数并不完全满意)