您可以使用 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)