Plugin's get_type_analyze_hook is not used for Annotated type in type alias or generic specialization
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
Mypy doesn't use plugin's get_type_analyze_hook for Annotated type used in type alias or generic specialization. However, the hook is used for custom types (not Annotated) used in these contexts, and it's also called for Annotated used in other contexts.
To Reproduce
plugin.py
from typing import Callable
from mypy.plugin import AnalyzeTypeContext, Plugin
from mypy.types import NoneType, Type
def plugin(version: str):
return MyPlugin
class MyPlugin(Plugin):
def get_type_analyze_hook(self, fullname: str) -> Callable[[AnalyzeTypeContext], Type] | None:
if fullname in {'typing.Annotated', 'typing_extensions.Annotated'}:
return _type_analyze
return None
def _type_analyze(ctx: AnalyzeTypeContext) -> Type:
ctx.api.note('Analyzing type of Annotated[...]', ctx.context)
return NoneType() # for the sake of example
module.py
from typing import Annotated, Generic, TypeAlias, TypeVar, reveal_type
AnnotatedTA: TypeAlias = Annotated[dict, None]
typed_with_alias: AnnotatedTA
reveal_type(typed_with_alias) # Revealed type is "builtins.dict[Any, Any]"
typed_directly: Annotated[dict, None] # Analyzing type of Annotated[...]
reveal_type(typed_directly) # Revealed type is "None", as expected
T = TypeVar('T')
class GenericType(Generic[T]):
dummy: T
class Specialization(GenericType[Annotated[dict, None]]):
...
reveal_type(Specialization().dummy) # Revealed type is "builtins.dict[Any, Any]"
Expected Behavior
All revealed types are None as requested by _type_analyze hook
Actual Behavior
Only directly typed variable typed_directly has the type requested by plugin
Your Environment
- Mypy version used: 1.10.1
- Mypy command-line flags: none
- Mypy configuration options from
mypy.ini(and other config files):plugins = plugin.py - Python version used: 3.8, 3.12
Background
I'm writing a plugin which generates TypedDictType for Annotated[dict, ...] annotations based on some external configuration files. The arguments to Annotated are string literals, so I can't really use generics. In runtime these are just normal dicts.
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 exécuter le reproducer plugin.py et module.py avec les versions de Python et de mypy indiquées, puis suivez l’analyse de types de Annotated en utilisation directe, de TypeAlias et de la spécialisation générique. C’est terminé lorsque le hook est invoqué dans les trois cas et que chaque reveal_type signale None comme demandé par _type_analyze.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- python
- Domaine
- devtools
- Type d'issue
- Bug
- Difficulté
- 3/5
- Temps estimé
- 1-2 jours
- Activité
- À l'abandon
- Clarté
- Clairement spécifiée
- Accessibilité débutants
- 48/100