python / python/mypy

Error when using Protocol and different __init__() signatures

Aperta
#9,597 1 commento 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

bug priority-2-low topic-join-v-union topic-protocols
Lingua principale
Python
Stelle
20.6k
Fork
3.3k
Metriche di merge delle PR
Metriche PR in attesa

Descrizione

I'm getting mypy errors when using Protocol with classes that have different __init__() signatures. In the following example, function bar() causes an error:

from typing import Dict, Type
from typing_extensions import Protocol


class HasName(Protocol):
    name: str


class Class1(HasName):
    name = 'class1'

    def __init__(self, a: int):
        pass


class Class2(HasName):
    name = 'class2'

    def __init__(self, a: int, b: int):
        pass


class Class3(HasName):
    name = 'class3'

    def __init__(self, a: int):
        pass


# OK
def foo() -> Dict[Type[HasName], int]:
    d = {}
    for cls in (
        Class1,
        Class3,
    ):
        d[cls] = 1
    return d

# error: Incompatible return value type (got "Dict[ABCMeta, int]", expected "Dict[Type[HasName], int]")
def bar() -> Dict[Type[HasName], int]:
    d = {}
    for cls in (
        Class1,
        Class2,
        Class3,
    ):
        d[cls] = 1
    return d


# OK
def baz(a: int) -> Type[HasName]:
    if a == 1:
        return Class1
    elif a == 2:
        return Class2
    else:
        return Class3

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Direzione di ricerca

Inizia eseguendo l'esempio minimo dell'issue con mypy e verifica come vengono inferite le tuple di classi eterogenee quando le loro firme init() differiscono. Il lavoro è completato quando la funzione bar() dell'esempio viene accettata in modo coerente con foo() e baz(), con un test di regressione che copra questo comportamento.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
python
Ambito
compilers, devtools
Tipo di issue
Bug
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
30/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.