Constraints on generic class with multiple TypeVar's

Aberta
#3,904 2 comentários 0 reações 0 responsáveis Ver no GitHub

Ninguém assumiu esta issue ainda.

Avaliação

Dificuldade
5/5
Tempo estimado
Mais de uma semana
Facilidade para iniciantes
25/100
Tipo de issue
Funcionalidade
Clareza
Precisa de esclarecimento
Status de atividade
Estagnada
Stack de tecnologia
python
Domínio
devtools

Direção de pesquisa

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.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

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.

Linguagem predominante
Python
Estrelas
20.6k
Forks
3.3k
Merge médio
1d 18h
PRs com merge (30d)
54

Guia de contribuição

Abrir o guia de contribuição

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de python/mypy

Todas as issues de python/mypy

Issues semelhantes

Mais issues de Python

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.