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)
关键说明
- 装饰器顺序必须遵循:先应用自定义装饰器(靠近被装饰函数),再应用
@validator(外层)。这样@validator装饰的是被自定义包装后的函数,验证执行时会触发你的打印逻辑。 - 若使用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
相关产品推荐
相关产品推荐

