pydantic 验证 PyCharm:此装饰器不会收到它可能期望的可调用对象;内置装饰器返回一个特殊对象

Bov*_*ist 8 python decorator pycharm

from pydantic import BaseModel


class Request(BaseModel):
    num: int

    @validator("num")
    @classmethod
    def validate_num(cls, num: int) -> int:
        return num
Run Code Online (Sandbox Code Playgroud)

对于上述代码,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)
Run Code Online (Sandbox Code Playgroud)

警告消失了,但代码在不应该执行的情况下执行时没有任何问题,这意味着验证由于某种原因被忽略。

小智 5

查看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]]:
Run Code Online (Sandbox Code Playgroud)

只需删除您的@classmethod装饰器即可!

  • 删除“@classmethod”装饰器将产生一个警告(在 PyCharm 中),说明通常方法的第一个参数应该是 self。在其他装饰器之上添加“@classmethod”似乎让 PyC​​harm 很高兴,但破坏了代码,因为它已经返回了一个类方法。我发现解决此问题的唯一方法是在 PyCharm 中安装“pydantic”插件。 (2认同)