在 pydantic 中声明计算的 python 级属性

2024-03-18

我有一个类源自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您想要从中导出它的字段,否则valuesdict 将不包含所需的值(例如,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(使用前将#替换为@)

在 pydantic 中声明计算的 python 级属性 的相关文章

  • 用于 bean 验证的自定义验证消息

    我正在创建一个 JSF 2 应用程序 并且尝试在 bean 中而不是 faces page 中使用表单验证 我还想使用 properties 文件来存储消息 我在看这个问题 https stackoverflow com questions
  • Gradle 额外属性在子项目中定义的自定义任务中不可见

    我正在尝试在多个 Gradle 任务之间重用通用逻辑 类似于中建议的内容这个答案 https stackoverflow com a 13072481 但我遇到了额外项目属性不可见的问题 归根结底 问题就在这里 假设我有一个根 Gradle
  • 如何检测 Java 系统属性是否已更改?

    我想知道系统属性何时更改 我在应用程序服务器中有一个应用程序 它以某种方式更改系统属性 System setProperty 我认为 我看了看 发现了不同的方法 JPDA https stackoverflow com questions
  • 使用 Apache Commons Configuration 通过属性文件中的值列表进行变量插值,即 ${variable}

    我正在使用 Apache Commons Configuration 来读取属性文件 并且我完全能够进行变量插值 并且还能够以列表形式检索多值属性 但是 我无法正确加载具有多个值的属性 其中一个值是对另一个多值属性的引用 变量插值 这是我的
  • 从 ASP.net VB 中的子页面访问母版页属性

    我有 masterpage master vb 其中有属性 例如 Private SQLerror As String Public Property SQLerror As String Get Return SQLerror End G
  • Grails:当我向 message.properties 添加新属性时出现 Native2ascii 错误

    当我在运行时向 grails 应用程序中的 message properties 文件添加新属性时 出现了一个奇怪的错误 当我通过命令行重新启动应用程序或重新启动STS时 此错误消失 我使用的是 2 0 1 版本 直到一周前 我还能够在运行
  • 使用 Google Guice 注入 java 属性

    我想使用 google guice 使属性在我的应用程序的所有类中可用 我定义了一个加载并绑定属性文件的模块测试属性 Property1 TEST Property2 25 包com test import java io FileNotF
  • Spring属性解密

    我们混合了一些尚未迁移到 spring boot 或 spring cloud 的遗留 Spring 应用程序以及 Spring Boot 应用程序 我正在创建一个 Spring 组件 如果属性值已加密且具有前缀 则该组件将在加载环境时自动
  • 托管对象中的标量类型仅适用于 iPhone 5

    属性 Latitude 是 LatitudeLongitude 类的标量类型 无法为其生成 setter 方法 当我为托管对象生成代码时 我收到一条消息 询问是否需要原始数据类型的标量属性 我应该使用它吗 我想让这个应用程序与 iPhone
  • 在 MS-Access 中以编程方式隐藏列

    我想根据用户选择的变量数据隐藏或显示列 如何在 MS Access 2003 中将列设置为隐藏 例如 用户更改事件后 For Each ctl In Me FormNameHere Form Controls If TypeName ctl
  • Typescript 将“接口”键作为字符串的并集传播

    是否可以将函数参数类型检查为其中之一interface s keys export interface IUser id string email string password string const updateUserPropert
  • vue组件设置child的数据值

    我正在使用 vue 轮播 https ssense github io vue carousel api https ssense github io vue carousel api 它运行良好 但我需要重置轮播 我可以看到当前页面有一个
  • 使用 PropertiesLauncher 启动的 Spring-boot(特定于配置文件)应用程序中出现覆盖应用程序属性的问题

    我在尝试使用文件系统上的覆盖文件中声明的另一个值来覆盖类路径上特定于配置文件的应用程序属性文件中声明的属性时遇到困难 我有一个自动配置的 Spring boot 应用程序 即 使用 EnableAutoconfiguration 有多个配置
  • JavaScript“可写”属性描述符如何工作?

    为什么 JavaScript 可写 属性描述符不禁止任何属性更改 例如 var TheDarkKnight Object create Superhero name value Batman writable false TheDarkKn
  • 作为属性的类引用

    谷歌对于这类搜索毫无用处 因为你会得到数亿个结果 其中没有一个与特定问题相关 问题很简单 Delphi 中是否可以有类引用属性 如果是这样 怎么办 这是我尝试过的 type TMyObject class end TMyObjectClas
  • C# 反射和获取属性

    我有以下虚拟类结构 我试图找出如何从 PeopleList 中 People 类的每个实例获取属性 我知道如何从 People 的单个实例中获取属性 但我无法弄清楚如何从 PeopleList 中获取它 我确信这真的很简单 但有人能指出我正
  • 如何在 Java 9 中使用新的 BeanInfo 注解

    JEP 256 BeanInfo 注释 http openjdk java net jeps 256为JavaBean http download java net java jdk9 docs api java beans JavaBea
  • 读取文件并获取 key=value 而不使用 java.util.Properties

    我正在构建一个 RMI 游戏 客户端将加载一个包含一些键和值的文件 这些键和值将用于多个不同的对象 它是一个保存游戏文件 但我不能为此使用 java util Properties 它符合规范 我必须读取整个文件并忽略注释行和与某些类不相关
  • 如何检索 iPhone 的区域设置

    我用谷歌搜索过它 但令我有点惊讶的是我找不到它 我只想访问设备配置的区域设置 我试图找到如何列出所有系统属性 以防我能在那里找到区域设置 但甚至找不到如何做到这一点 我知道 认为 我之前检索过系统属性 但我也记得在谷歌搜索时找到该信息并不容
  • 将父控件的属性传递给子控件

    我正在为特定应用程序开发一组自定义控件 我想定义对于外观目的的控件集通用的属性 为了论证 让我们这样做CustomCtrl AccentColor 我想为我的 Windows 窗体定义相同的属性 即Form1 AccentColor当我更改

随机推荐