python / python/mypy

Associated types on generics

Ouverte
#7,790 3 commentaires 34 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

feature priority-1-normal
Langage dominant
Python
Étoiles
20.6k
Forks
3.3k
Métriques de merge des PR
Métriques de PR en attente

Description

  • Request Type: Feature Request

  • Mock-up repro (more detailed mock-up here):

    import abc
    import typing
    
    
    # Define two base types `ABase` & `BBase` with a similar interface,
    # that each return a different object type `AValue` & `BValue` from
    # some method
    #
    # The object type is also reexposed as a class attribute on the
    # respective base type for easier access.
    class AValue:
    	value: bytes
    	
    	def __init__(self, value: bytes):
    		self.value = value
    
    class ABase(metaclass=abc.ABCMeta):
    	VALUE_T = AValue
    	
    	@abc.abstractmethod
    	def get_some_value(self) -> AValue: ...
    
    
    class BValue:
    	value: str
    	
    	def __init__(self, value: str):
    		self.value = value
    
    class BBase(metaclass=abc.ABCMeta):
    	VALUE_T = BValue
    	
    	@abc.abstractmethod
    	def get_some_value(self) -> BValue: ...
    
    
    # Define generic type over the two defined above
    AnyBase = typing.TypeVar("AnyBase", ABase, BBase)
    
    #
    # HOW WOULD I NAME THE RETURN TYPE IN THE NEXT LINE?
    #
    # In particular note that the return type could not be just `AnyBase`
    # (over which we are generic) since we aren't returning *that* type,
    # but some other type determined by which type `AnyBase` is.
    def magic_convert(input: AnyBase) -> AnyBase.VALUE_T: #???
    	return input.VALUE_T(self.get_some_value().value * 2)```
    
    
  • Actual behaviour: There does seem to be anything like AnyBase.VALUE_T available for use in mypy and the given syntax results in both type-time and runtime errors.

  • Expected behaviour: Some way to do this.

  • mypy version: 0.730

  • Python version: 3.7 (Debian)

  • mypy flags: None

I used some title that probably is close to the real (type theory) name of this feature, feel free to change it to something more fitting. 🙂

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 la reproduction en Python 3.7 de l’issue et lisez la maquette détaillée liée pour comprendre la relation de type associé souhaitée. Définissez à quoi doivent ressembler la syntaxe prise en charge et le comportement de vérification des types pour le type de retour générique, y compris l’exemple magic_convert présenté ; l’issue est terminée lorsque mypy peut exprimer et valider cette relation sans les erreurs de typage ou d’exécution signalées.

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é
À clarifier
Accessibilité débutants
30/100

Recevez les nouvelles issues par e-mail

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