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

问题描述 投票:0回答:2
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)

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

python pycharm decorator
2个回答
6
投票

查看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
装饰器即可!


2
投票

这是 PyCharm 中的误报提示

相关问题: https://youtrack.jetbrains.com/issue/PY-34368/False-warning-This-decorator-will-not-receive-a-callable-it-may-expect-when-classmethod-is-not-the -最后申请

解决方法: 在上面添加这个字符串

# noinspection PyNestedDecorators
© www.soinside.com 2019 - 2024. All rights reserved.