【问题标题】:Triggering a function on creation of an pydantic object在创建 pydantic 对象时触发函数
【发布时间】:2021-09-30 08:27:51
【问题描述】:

每当我创建/实例化一个 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. 我认为一旦对象发生变化,这个函数也会被执行,这是我不想要的。

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

【问题讨论】:

    标签: python python-3.x pydantic


    【解决方案1】:

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

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

    【讨论】:

    【解决方案2】:

    你可以使用 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__ 之后调用一次,因此在更改类实例后不会调用它。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多