我有一个类源自pydantic.BaseModel
并想创建一个“假”属性,即计算属性。 property 关键字似乎不能以通常的方式与 Pydantic 配合使用。下面是 MWE,其中类存储值并定义称为的读/写属性half
具有明显的意义。使用 Pydantic 读取属性可以正常工作,但赋值失败。
我知道 Pydantic 正在修改属性访问的低级细节;也许有一种方法可以在 Pydantic 中以不同的方式定义计算域?
import pydantic
class Object(object):
def __init__(self,*,value): self.value=value
half=property(lambda self: .5*self.value,lambda self,h: setattr(self,'value',h*2))
class Pydantic(pydantic.BaseModel):
class Config:
extra='allow'
value: float
half=property(lambda self: .5*self.value,lambda self,h: setattr(self,'value',h*2))
o,p=Object(value=1.),Pydantic(value=1.)
print(o.half,p.half)
o.half=p.half=2
print(o.value,p.value)
输出(值=1。未通过分配修改half
在 Pydantic 案例中):
0.5 0.5
4 1.0
我今天碰巧正在研究同样的问题。正如所讨论的,官方尚不支持here https://github.com/samuelcolvin/pydantic/issues/935.
然而,我确实找到了下面的例子 https://github.com/samuelcolvin/pydantic/issues/1928#issuecomment-692366291效果很好:
class Person(BaseModel):
first_name: str
last_name: str
full_name: str = None
@validator("full_name", always=True)
def composite_name(cls, v, values, **kwargs):
return f"{values['first_name']} {values['last_name']}"
请确保您的派生字段出现after您想要从中导出它的字段,否则values
dict 将不包含所需的值(例如,full_name 位于需要从值中获取的first_name 和last_name 之后)。
UPDATE:正如下面 Hyagoro 提到的,现在有官方支持的compute_field装饰器 https://docs.pydantic.dev/2.0/usage/computed_fields/在 Pydantic 2 中。不幸的是,该功能不会向后移植到 Pydantic v1 (Source https://github.com/pydantic/pydantic/issues/935#issuecomment-1548141547)。所以在 Pydantic v2 中,上面的例子变成了:
from pydantic import BaseModel, computed_field
class Person(BaseModel):
first_name: str
last_name: str
full_name: str = None
@computed_field
@property
def composite_name(self):
return f"{self.first_name} {self.last_name}"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)