当我创建/实例化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")
上执行我的逻辑并简单地返回相同的对象值。
这是可行的,但我有两个问题,这就是为什么我会对更清洁的解决方案感兴趣:
- 我基本上不做验证(返回相同的值)
- 我认为一旦对象被更改,这个函数也会被执行,这是我不想要的
所以我很高兴了解任何更好的方法/解决方案。
您的意图并不完全清楚。但我可以提出一种覆盖__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!")