gpt4 book ai didi

python - Pydantic:在将值分配给字段之前转换值?

转载 作者:行者123 更新时间:2023-12-05 02:29:08 25 4
gpt4 key购买 nike

我有以下模型

class Window(BaseModel):
size: tuple[int, int]

我想像这样实例化它:

fields = {'size': '1920x1080'}
window = Window(**fields)

当然这会失败,因为 'size' 的值类型不正确。但是,我想添加逻辑以便将值拆分为 x,即:

def transform(raw: str) -> tuple[int, int]:
x, y = raw.split('x')
return int(x), int(y)

Pydantic 支持这个吗?

最佳答案

您可以使用 pydantic 的 validator 实现这样的行为。给定您的预定义函数:

def transform(raw: str) -> tuple[int, int]:
x, y = raw.split('x')
return int(x), int(y)

你可以像这样在你的类中实现它:

from pydantic import BaseModel, validator


class Window(BaseModel):

size: tuple[int, int]
_extract_size = validator('size', pre=True, allow_reuse=True)(transform)

注意传递给验证器的 pre=True 参数。这意味着它将在检查 size 是否为元组的默认验证器之前运行。

现在:

fields = {'size': '1920x1080'}
window = Window(**fields)
print(window)
# output: size=(1920, 1080)

请注意,在那之后,您将无法使用大小元组实例化您的 Window

fields2 = {'size': (800, 600)}
window2 = Window(**fields2)
# AttributeError: 'tuple' object has no attribute 'split'

为了克服这个问题,如果通过稍微更改代码来传递元组,您可以简单地绕过该函数:

def transform(raw: str) -> tuple[int, int]:
if type(raw) == tuple:
return raw
x, y = raw.split('x')
return int(x), int(y)

应该给出:

fields2 = {'size': (800, 600)}
window2 = Window(**fields2)
print(window2)
# output: size:(800, 600)

关于python - Pydantic:在将值分配给字段之前转换值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72360442/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com