在创建 pydantic 对象时触发函数
Triggering a function on creation of an pydantic object
每当我创建/实例化一个 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")
执行我的逻辑并简单地 returns 相同的对象值。
这可行,但我必须解决问题,这就是为什么我会对更清洁的解决方案感兴趣:
- 我基本上不做验证(return相同的值)。
- 我想这个函数也会在对象改变时执行,我不希望这样。
所以我很高兴有任何更好的方法/解决方案。
您可以使用 python dataclass __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__
之后调用一次,因此在对 class 实例进行更改后不会调用它。
你的意图并不完全清楚。但我可以建议一个压倒一切的 __init__
模型方法。在这种情况下,您的代码将在对象实例化时执行一次:
from pydantic import BaseModel
class PydanticClass(BaseModel):
name: str
def __init__(self, **data) -> None:
super().__init__(**data)
print("Put your logic here!")
每当我创建/实例化一个 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")
执行我的逻辑并简单地 returns 相同的对象值。
这可行,但我必须解决问题,这就是为什么我会对更清洁的解决方案感兴趣:
- 我基本上不做验证(return相同的值)。
- 我想这个函数也会在对象改变时执行,我不希望这样。
所以我很高兴有任何更好的方法/解决方案。
您可以使用 python dataclass __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__
之后调用一次,因此在对 class 实例进行更改后不会调用它。
你的意图并不完全清楚。但我可以建议一个压倒一切的 __init__
模型方法。在这种情况下,您的代码将在对象实例化时执行一次:
from pydantic import BaseModel
class PydanticClass(BaseModel):
name: str
def __init__(self, **data) -> None:
super().__init__(**data)
print("Put your logic here!")