在创建pydantic对象时触发函数


当我创建/实例化pydantic对象时,有没有一种干净的方法可以触发函数调用?

目前我是";滥用";此的root_validator

from pydantic import BaseModel
class PydanticClass(BaseModel):
name: str
@root_validator()
def on_create(cls, values):
print("Put your logic here!")
return values

因此,在PydanticClass(name="Test")上执行我的逻辑并简单地返回相同的对象值。

这是可行的,但我有两个问题,这就是为什么我会对更清洁的解决方案感兴趣:

  1. 我基本上不做验证(返回相同的值)
  2. 我认为一旦对象被更改,这个函数也会被执行,这是我不想要的

所以我很高兴了解任何更好的方法/解决方案。

您的意图并不完全清楚。但我可以提出一种覆盖__init__模型的方法。在这种情况下,您的代码将在对象实例化时执行一次:

from pydantic import BaseModel

class PydanticClass(BaseModel):
name: str
def __init__(self, **data) -> None:
super().__init__(**data)
print("Put your logic here!")

您可以使用python数据类__post_init__:

from pydantic.dataclasses import dataclass
@dataclass
class PydanticClass:
name: str
def __post_init__(self):
print("Post init")
pc = PydanticClass(name="Test")
print(pc)

post_init__init__之后调用一次,因此在对类实例进行更改后不会调用它。

从Pydantic v2开始,您现在可以覆盖model_post_init方法。

from pydantic import BaseModel

class PydanticClass(BaseModel):
name: str
def model_post_init(self, ctx):
print("Put your logic here!")

最新更新