ABC subclasses may break `issubclass(T, T)` invariant
Abierto
Nadie ha tomado este issue todavía.
extension-modules
stdlib
type-bug
- Lenguaje dominante
- Python
- Estrellas
- 77.2k
- Forks
- 36k
- Métricas de merge de PR
- Métricas de PR pendientes
Descripción
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
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Ejecuta el reproductor de Python proporcionado en CPython 3.12 y rastrea ABC.init_subclass e issubclass durante la inicialización de Multi. Investiga por qué First ya no satisface issubclass(First, First); el trabajo estará terminado cuando pasen las aserciones de invariantes para la jerarquía de diamante y exista cobertura de regresión para este caso.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- python
- Área
- backend
- Tipo de issue
- Error
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 35/100