python / python/mypy

More-helpful typing errors with Generics and Callables

Ouverte
#15,522 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

feature topic-error-reporting topic-usability
Langage dominant
Python
Étoiles
20.6k
Forks
3.3k
Métriques de merge des PR
Métriques de PR en attente

Description

Feature

Taking into consideration the following code (using mypy==1.4.1), the error messages are not very useful in debugging the problem. I have included the Pyright error message for comparison:

"""A test pipeline"""
from __future__ import annotations

from typing import Callable, Generic, TypeVar

from pydantic import BaseModel

from filter_base.filters.base_filter import BaseFilter

ModelT = TypeVar("ModelT", bound=BaseModel)


class TestFilter(BaseFilter, Generic[ModelT]):
    """A filter for loading a JSON file."""

    def __init__(self, model_type: type[ModelT]):
        """Test filter."""
        self.model_type: type[ModelT] = model_type

    def output(self) -> ModelT:
        """Output the loaded model"""
        return self.model_type()

    def input(self, obj: ModelT) -> None:
        """Input the model"""
        pass


T = TypeVar("T")


def connect(
    connect_signal: Callable[[], T],
    connect_slot: Callable[[T], None],
) -> None:
    """Connect a signal to a slot"""

    # TODO: this is a bit silly - we're just immedicately calling the signal/slot
    # however - it'll do for the purposes of type checking
    connect_slot(connect_signal())


class SimpleModel(BaseModel):
    """A simple model"""

    a: int
    b: str


class SimpleModel2(BaseModel):
    """A simple model"""

    c: int
    d: str


def main() -> None:
    a = TestFilter(SimpleModel)
    b = TestFilter(SimpleModel2)

    connect(a.output, b.input)

The diagnostics from mypy and Pyright are as follows (error is on the final line of code):

Diagnostics:
1. mypy: Cannot infer type argument 1 of "connect" [misc]
2. Pyright: Argument of type "(obj: SimpleModel2) -> None" cannot be assigned to parameter "connect_slot" of type "(T@connect) -> None" in function "connect"
     Type "(obj: SimpleModel2) -> None" cannot be assigned to type "(SimpleModel) -> None"
       Parameter 1: type "SimpleModel" cannot be assigned to type "SimpleModel2"
         "SimpleModel" is incompatible with "SimpleModel2" [reportGeneralTypeIssues]

Pitch

Having the error messages of mypy more in-line with Pyright's reporting would mean that it is not essential to use Pyright's typechecking system when developing these sorts of generic systems.

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 Python fourni avec mypy 1.4.1 et comparez son diagnostic final avec la sortie de Pyright affichée dans l’issue. Le travail est terminé lorsque mypy explique l’argument Generic Callable incompatible avec des détails de type tout aussi exploitables ; l’issue n’indique aucun fichier source ni test à cibler.

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

Évaluation

Stack technique
python
Domaine
devtools
Type d'issue
Fonctionnalité
Difficulté
5/5
Temps estimé
Plus d'une semaine
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
25/100

Recevez les nouvelles issues par e-mail

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