【问题标题】:pydantic validation PyCharm: This decorator will not receive a callable it may expect; the built-in decorator returns a special objectpydantic validation PyCharm:这个装饰器不会收到它可能期望的可调用;内置装饰器返回一个特殊对象
【发布时间】: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 的实例”

标签: python pycharm decorator


【解决方案1】:

查看 github 上的 source code,您会看到 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 装饰器!

【讨论】:

    猜你喜欢
    • 2019-11-18
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 2020-08-19
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    相关资源
    最近更新 更多