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)
警告消失了,但代码在不应该执行的情况下执行时没有任何问题,这意味着验证由于某种原因被忽略。
查看github上的源代码,你会发现
validator
装饰器已经返回了一个classmethod
。
def validator(
*fields: str,
mode: Literal['before', 'after', 'wrap', 'plain'] = 'after',
check_fields: bool | None = None,
sub_path: tuple[str | int, ...] | None = None,
allow_reuse: bool = False,
) -> Callable[[Callable[..., Any]], classmethod[Any]]:
只需删除您的
@classmethod
装饰器即可!
这是 PyCharm 中的误报提示
解决方法: 在上面添加这个字符串
# noinspection PyNestedDecorators