python / python/mypy

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

オープン
#16,274 コメント 1 件 リアクション 1 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

bug
主要言語
Python
スター
20.6k
フォーク
3.3k
平均マージ
1日 18時間
マージ済み PR(30日)
54

説明

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

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

調査の方向性

Issue の mypy-play の例から始め、subclasses() のリスト内包表記に対する診断を再現してください。既存のコンテキストを確認するため、関連する Issue #15554、#14106、#3115 を読んでください。完了条件は、実際に抽象クラスをインスタンス化している場合は引き続き診断される一方で、この例では抽象クラスのインスタンス化エラーが報告されなくなることです。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
python
領域
tooling
issue の種類
バグ
難易度
4/5
見積もり時間
3〜5日
活発さ
停滞
明瞭さ
おおむね明確
初心者へのやさしさ
35/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。