ABC subclasses may break `issubclass(T, T)` invariant
Aberta
Ninguém assumiu esta issue ainda.
extension-modules
stdlib
type-bug
- Linguagem predominante
- Python
- Estrelas
- 77.2k
- Forks
- 35.9k
- Métricas de merge de PRs
- Métricas de PR pendentes
Descrição
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
Guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Direção de pesquisa
Execute o reprodutor Python fornecido no CPython 3.12 e rastreie ABC.init_subclass e issubclass durante a inicialização de Multi. Investigue por que First não satisfaz mais issubclass(First, First); o trabalho estará concluído quando as asserções dos invariantes passarem para a hierarquia em diamante, com cobertura de regressão para este caso.
Escrita pelo modelo de indexação a partir do texto da issue.
Avaliação
- Stack de tecnologia
- python
- Domínio
- backend
- Tipo de issue
- Bug
- Dificuldade
- 4/5
- Tempo estimado
- 3-5 dias
- Status de atividade
- Estagnada
- Clareza
- Razoavelmente clara
- Facilidade para iniciantes
- 35/100