2 votes

Décorez correctement l'annotateur avec ParamSpec en utilisant la nouvelle syntaxe de typage (3.12)

Je suis en train d'essayer d'utiliser de nouvelles indications de type de Python 3.12, et soudain PyCharm met en évidence un problème obscur concernant l'utilisation de 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

Sur return inner, PyCharm le reproche :

Type attendu '(Message, ParamSpec("P")) -> None', obtenu '(message: Message, ParamSpec("P"), ParamSpec("P")) -> None' à la place

Voici la capture d'écran.

BTW, j'utilise ce décorateur ici et là, et le code fonctionne parfaitement. Pyright ne se plaint pas de problèmes ici non plus.

Je ne parviens pas à repérer le problème. Pouvez-vous ?

1voto

InSync Points 713

Votre code ne pose aucun problème. Le problème vient de PyCharm.

Son support pour Concatenate et autres est incomplet, comme discuté dans PY-51766. Je n'arrive pas à trouver un bon ticket existant pour ce bug, cependant.

Ajoutez un commentaire type: ignore ou noqa là et passez à autre chose.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X