【问题标题】:creating a weakref to pydantic model创建一个弱引用到 pydantic 模型
【发布时间】:2021-05-29 20:28:38
【问题描述】:

是否可以创建 pydantic 模型的弱引用?

from pydantic import BaseModel
from uuid import UUID

class JEdgeModel(BaseModel):
    uid: UUID
    startSocket: UUID
    destnSocket: UUID

a = JEdgeModel(uid='abd6fc3f882544f5b75661c92fccbd0d', startSocket='abd6fc3f882544f5b75661c92fccbd0d', destnSocket='abd6fc3f882544f5b75661c92fccbd0d')

wk = weakref.ref(a)

我收到以下错误: cannot create weak reference to 'JEdgeModel' object

有没有办法达到同样的效果?

【问题讨论】:

  • 嗨:你能解释一下上下文吗?为什么这里需要弱引用?
  • 您需要将必填字段 __weakref__ 添加到 BaseModel.__slots__ 以使类支持弱引用。
  • @DanD。谢谢,如果你回答我可以将其标记为解决方案
  • @jossefaz m 创建 PyQt 应用程序,我需要传递我需要更新的模型的引用。我知道我可以在新窗口中更新模型的副本并将其发回,但是创建相同的弱引用可以为我节省一些麻烦。我不确定解决这样的问题是否是一个好习惯!

标签: python weak-references pydantic


【解决方案1】:

来自documentation

如果每个实例没有 weakref 变量,定义 slots 的类不支持对其实例的弱引用。如果需要弱引用支持,则将 'weakref' 添加到 slots 声明中的字符串序列中。

所以只需将__weakref__ 添加到模型中的__slot__

class JEdgeModel(BaseModel):
    __slots__ = ['__weakref__']
    uid: UUID
    startSocket: UUID
    destnSocket: UUID

a = JEdgeModel(
    uid='abd6fc3f882544f5b75661c92fccbd0d',
    startSocket='abd6fc3f882544f5b75661c92fccbd0d',
    destnSocket='abd6fc3f882544f5b75661c92fccbd0d',
)

wk = weakref.ref(a)

【讨论】:

    猜你喜欢
    • 2020-07-04
    • 2021-11-03
    • 2020-05-22
    • 2022-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多