python / python/mypy

Parameterized protocol structure ignored as argument

Ouverte
#14,798 1 commentaire 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

bug
Langage dominant
Python
Étoiles
20.6k
Forks
3.3k
Merge moyen
1 j 18 h
PR mergées (30 j)
54

Description

Bug Report

Parameterized protocols seem to be largely or totally ignored when specified as argument types. Simple example:

from typing import Protocol, TypeVar

T = TypeVar("T")
T_co = TypeVar("T_co", covariant=True)


class Proto(Protocol[T_co]):
    def __call__(self, *, a: str) -> T_co:
        ...


class InvalidClass:
    def __init__(self, *, a: int) -> None:
        ...


def test(b: Proto[T]) -> T:
    return b(a="0")
    

test(InvalidClass)  # <-- should fail type checking

InvalidClass is accepted here even though it does not conform to the protocol. Here's a more detailed playground gist.

As demonstrated in the gist, the issue does not reproduce when a function is provided, only with a class. It also does not manifest with assignment, only with arguments. However, assigning with the parameter set to Any also produces an unexpected result, which might somehow be related.

  • Mypy version used: 1.0
  • Mypy command-line flags:
  • Mypy configuration options from mypy.ini (and other config files):
  • Python version used: 3.11

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez par reproduire l’exemple minimal avec mypy 1.0 sur Python 3.11, puis comparez-le avec le gist du playground indiqué et ses flags stricts. La correction est terminée lorsque mypy rejette test(InvalidClass) parce qu’il ne se conforme pas à Proto, tout en préservant le comportement signalé pour les fonctions et les affectations.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
python
Domaine
tooling
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
À l'abandon
Clarté
Clairement spécifiée
Accessibilité débutants
45/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.