python / python/mypy

enumerating concrete subclasses of an abstract base class causes false positive "Cannot instantiate abstract class X with abstract attribute Y"

Aperta
#16,274 1 commento 1 reazione 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

bug
Lingua principale
Python
Stelle
20.6k
Fork
3.3k
Metriche di merge delle PR
Metriche PR in attesa

Descrizione

I have a number of concrete classes which all derive from the same abstract base class. Creating a list of instances using __subclasses__() in a list comprehension, mypy complains that I'm trying to instantiate the abstract class.

Simple example:
https://mypy-play.net/?mypy=latest&python=3.11&gist=f03c51fac1173ae0bb751b00e614de68

from abc import ABC, abstractmethod
from typing import List

class Animal(ABC):
    @abstractmethod
    def talk(self) -> str:
        pass

class Dog(Animal):
    def talk(self) -> str:
        return "woof"

class Cat(Animal):
    def talk(self) -> str:
        return "miaow"

# enumerate using __subclasses__()
animals: List[Animal] = [
    subclass() for subclass in Animal.__subclasses__()
]
print(animals)

# hard-coding subclass instances is fine
animals2: List[Animal] = [
     Dog(), Cat()
]

Expected Behavior
As I'm not actually instantiating the abstract class, the mypy error looks like a false positive.

Your Environment
python 3.10.12
mypy v1.6.0

Possibly related issues
#15554
#14106
#3115

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 con l’esempio mypy-play nell’issue e riproduci la diagnostica per la list comprehension di subclasses(). Leggi le issue correlate #15554, #14106 e #3115 per il contesto esistente. Il lavoro è completato quando l’esempio non segnala più un errore di istanziazione di una classe astratta, mentre le istanziazioni effettive di classi astratte continuano a essere diagnosticate.

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

Valutazione

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

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.