appending `#type:ignore` to an import does more than skipping analyzing the import
Personne n'a encore pris cette issue.
- Langage dominant
- Python
- Étoiles
- 20.6k
- Forks
- 3.3k
- Métriques de merge des PR
- Métriques de PR en attente
Description
Bug Report
I ran into relatively low priority unexpected behavior. I have this code
from anytree import NodeMixin # type:ignore
from typing import *
from abc import abstractmethod
class IFoo(Protocol):
@abstractmethod
def foo(self) -> None:
raise NotImplementedError()
class Foo(IFoo, NodeMixin):
...
def main() -> None:
a = Foo()
if __name__ == '__main__':
main()
anytree is a third-party package. When I run mypy on it, I expect that static analysis on anytree to be skipped, and static analysis on Foo to fail with something like "Foo needs to implement abstractmethod foo". What actually happens is that mypy exits with success saying 0 errors were found.
What I've tried to do to cause the expected behavior to occur was to use stubgen on the anytree install which generated stubs in the project folder, run mypy --install-types to install type hints for a dependency of anytree, and configure a mypy.ini in project root to point to the stubs. All of which was simple to do, but kind of tedious.
I also read https://mypy.readthedocs.io/en/stable/running_mypy.html#missing-imports where it mentioned
This can result in mypy failing to warn you about errors in your code. Since operations on Any result in Any, these dynamic types can propagate through your code, making type checking less effective. See Dynamically typed code for more information.
So I guess the suppression of static checking is leaking from anytree.NodeMixin into Foo.
Actual Behavior
mypy exits with success, 0 errors
Your Environment
I'm on Windows.
- Mypy version used: 0.990
- Mypy command-line flags: N/A
- Mypy configuration options from
mypy.ini(and other config files): N/A - Python version used: 3.10.4
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Commencez par le reproducteur de l’issue et exécutez mypy 0.990 pour confirmer que la suppression de l’import masque également l’erreur de méthode abstraite dans Foo. Suivez le traitement de # type: ignore sur les imports et ajoutez un test de régression montrant que l’import est ignoré sans supprimer les erreurs dans le code qui utilise la classe de base importée ; c’est terminé lorsque l’exemple signale l’implémentation manquante de foo dans Foo.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- python
- Domaine
- compilers, devtools
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 35/100