You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pyndantic中@validator装饰器包装器失效,求成功后打印消息的实现方案

问题分析与解决方案

你的问题出在装饰器顺序错误:Pydantic的@validator装饰器会将原函数转换为内部的验证器对象,若把自定义装饰器放在@validator上方,实际装饰的是这个转换后的对象,而非真正执行验证逻辑的原函数,导致打印逻辑无法触发。

修正后的代码

from pydantic import BaseModel, validator

def validator_decorator(message):
    def decorator(func):
        def wrapper(cls, v, values, config, field):
            result = func(cls, v, values, config, field)
            print(message)
            return result
        return wrapper
    return decorator

class MyModel(BaseModel):
    name: str

    @validator('name')
    @validator_decorator("name validator")  # 调换顺序,放在@validator下方
    def name_must_contain_space(cls, v):
        if ' ' not in v:
            raise ValueError('must contain a space')
        return v.title()

# 测试
try:
    MyModel(name="John")
except ValueError as e:
    print(e)

model = MyModel(name="John Doe")
print(model.name)

关键说明

  1. 装饰器顺序必须遵循:先应用自定义装饰器(靠近被装饰函数),再应用@validator(外层)。这样@validator装饰的是被自定义包装后的函数,验证执行时会触发你的打印逻辑。
  2. 若使用Pydantic v2,推荐用@field_validator替代旧的@validator,写法类似,同样需注意装饰器顺序:
from pydantic import BaseModel, field_validator

def validator_decorator(message):
    def decorator(func):
        def wrapper(cls, v, info):
            result = func(cls, v, info)
            print(message)
            return result
        return wrapper
    return decorator

class MyModel(BaseModel):
    name: str

    @field_validator('name')
    @validator_decorator("name validator")
    def name_must_contain_space(cls, v, info):
        if ' ' not in v:
            raise ValueError('must contain a space')
        return v.title()

内容的提问来源于stack exchange,提问作者Kuruva Vinod Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 22:13:14