enumerating concrete subclasses of an abstract base class causes false positive "Cannot instantiate abstract class X with abstract attribute Y"
まだ誰も着手していません。
- 主要言語
- 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
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
Issue の mypy-play の例から始め、subclasses() のリスト内包表記に対する診断を再現してください。既存のコンテキストを確認するため、関連する Issue #15554、#14106、#3115 を読んでください。完了条件は、実際に抽象クラスをインスタンス化している場合は引き続き診断される一方で、この例では抽象クラスのインスタンス化エラーが報告されなくなることです。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- python
- 領域
- tooling
- issue の種類
- バグ
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 活発さ
- 停滞
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 35/100