Constraints on generic class with multiple TypeVar's

Ouverte
#3,904 2 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Évaluation

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

Piste de recherche

The issue provides a Python reproducer but names no source file or test. Start by running the example with mypy and locating the TypeVar, Generic, and overload-checking tests. Done means establishing whether paired constraints can be expressed and, if supported, adding coverage for the allowed and rejected combinations.

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

Description

feature priority-2-low

Is there a way to limit the possible combinations of TypeVar's instantiations for Generics with multiple TypeVar's?

Let's look at the following example:

import sys
from typing import TypeVar, Generic, overload

assert sys.version_info >= (3, 5)


class Foo(object):
    def __init__(self, dummy):
        self.dummy = dummy


class Bar(object):
    def __init__(self, dummy):
        self.dummy = dummy


class Apple(object):
    def __init__(self, dummy):
        self.dummy = dummy


class Pear(object):
    def __init__(self, dummy):
        self.dummy = dummy


Var1 = TypeVar('Var1', Foo, Apple)
Var2 = TypeVar('Var2', Bar, Pear)


@overload
def combine(left: Foo, right: Bar) -> None:
    ...


@overload
def combine(left: Apple, right: Pear) -> None:
    ...


def combine(left, right):
    print(left.dummy + " and " + right.dummy)


class MyClass(Generic[Var1, Var2]):
    def __init__(self, a: Var1) -> None:
        self.dummy = dummy  # type: Var1

    def add(self, other: Var2) -> None:
        combine(self.dummy, other)

Here, mypy produces this error output:

mypy_example.py:50: error: No overload variant of "combine" matches argument types [mypy_example.Foo*, mypy_example.Pear*]
mypy_example.py:50: error: No overload variant of "combine" matches argument types [mypy_example.Apple*, mypy_example.Bar*]

Is there any possibility to restrict MyClass to MyClass[Apple, Pear] and MyClass[Foo, Bar] but disallow MyClass[Apple, Bar] and MyClass[Foo, Pear]? This is for python 3.5.

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

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.

Autres issues de python/mypy

Toutes les issues de python/mypy

Issues similaires

Plus d'issues Python

Recevez les nouvelles issues par e-mail

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