ABC subclasses may break `issubclass(T, T)` invariant
Ouverte
Personne n'a encore pris cette issue.
extension-modules
stdlib
type-bug
- Langage dominant
- Python
- Étoiles
- 77.2k
- Forks
- 35.9k
- Métriques de merge des PR
- Métriques de PR en attente
Description
Bug report
Bug description:
This was a nasty bug to track down. I really don't have a clue why this would happen. It seems to be triggered under these conditions:
- A root class (
Root) inherits fromABC - There's diamond-shaped inheritance for a sub-subclass (
Multi) - In
Root.__init_subclass__, whenMultiis initializing, a check is performed to see ifFirstis a subclass ofSecond Firstis no longer a subclass of itself
from abc import ABC
class Root(ABC):
def __init_subclass__(cls, **kwargs):
if cls.__name__ == "Multi":
# issubclass(Second, First) # Wouldn't trigger the bug for Second
issubclass(First, Second) # Triggers the bug for First
issubclass(Second, First) # Doesn't trigger the bug for Second
class First(Root): ...
class Second(Root): ...
class Multi(First, Second): ...
assert not issubclass(First, First) # This is the bug.
assert issubclass(Second, Second)
print("bug!")
CPython versions tested on:
3.12
Operating systems tested on:
macOS
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Exécuter le reproducer Python fourni avec CPython 3.12 et suivre ABC.init_subclass et issubclass pendant l’initialisation de Multi. Chercher pourquoi First ne satisfait plus issubclass(First, First) ; le travail est terminé lorsque les assertions d’invariants passent pour la hiérarchie en diamant et qu’une couverture de régression existe pour ce cas.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- python
- Domaine
- backend
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 35/100