【发布时间】:2023-02-17 00:56:16
【问题描述】:
from pydantic import BaseModel
class Request(BaseModel):
num: int
@validator("num")
@classmethod
def validate_num(cls, num: int) -> int:
return num
PyCharm 为上述代码发出警告“此装饰器将不会收到它可能期望的可调用对象;内置装饰器返回一个特殊对象”。我认为警告不明确,所以我会很感激一些帮助。
当我将上面的代码更改为:
from fastapi.exceptions import RequestValidationError
from pydantic import BaseModel, validator
from pydantic.error_wrappers import ErrorWrapper
class Request(BaseModel):
num: int
@classmethod
@validator("num")
def validate_num(cls, num: int) -> int:
if num < 0:
raise RequestValidationError([ErrorWrapper(ValueError("error"), ())])
return num
request = Request(num=-2)
警告消失了,但是代码在不应该执行的时候没有任何问题地执行,这意味着由于某种原因验证被忽略了。
【问题讨论】:
-
它只是建议您将
@classmethod放在其他装饰器之上,因为classmethod()的返回值不是普通函数,并且可能不适用于需要函数的典型装饰器。 -
@jasonharper 嗯。我把它放在另一个装饰器上面,但现在验证函数被忽略了。请检查我的新编辑。
-
@snakecharmerb 引自文档here:“验证器是“类方法”,因此它们收到的第一个参数值是 UserModel 类,而不是 UserModel 的实例”