使用新的类型语法正确地使用 ParamSpec 注释装饰器 (3.12)

问题描述 投票:0回答:1

我正在尝试使用 Python 3.12 中的新类型提示,突然 PyCharm 突出显示了有关

ParamSpec
新用法的一些模糊问题。

import functools
from dataclasses import dataclass
from typing import Callable
from typing import Concatenate


@dataclass
class Message:
    text: str


type CheckFunc[**P] = Callable[Concatenate[Message, P], None]


def check_is_command_not_answer[**P](func: CheckFunc[P]) -> CheckFunc[P]:
    @functools.wraps(func)
    def inner(message: Message, *args: P.args, **kwargs: P.kwargs) -> None:
        if message.text:
            ...
        else:
            return func(message, *args, **kwargs)

    return inner

关于

return inner
PyCharm 的指责:

预期类型 '(Message, ParamSpec("P")) -> None',却得到 '(message: Message, ParamSpec("P"), ParamSpec("P")) -> None'

这是截图

顺便说一句,我到处使用这个装饰器,并且代码运行得很好。 Pyright 也不抱怨这里的任何问题。

我无法发现问题所在。可以吗?

python pycharm python-typing python-3.12
1个回答
1
投票

你的代码没有问题。问题出在 PyCharm 上。

它对

Concatenate
等人的支持。不完整,如PY-51766中所述。然而,我无法为这个错误找到一个好的现有问题。

在那里发表

type: ignore
noqa
评论并继续。

© www.soinside.com 2019 - 2024. All rights reserved.