`isinstance` removes `cls.__dict__["__annotations__"]` in a complex setup with Protocol and ABCMeta
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 4/5
- Tempo estimado
- 3-5 dias
- Facilidade para iniciantes
- 35/100
Direção de pesquisa
Execute o reproducer envolvendo Module.init_subclass, CheckpointableIterator, Protocol, ABCMeta e isinstance no Python 3.12 e 3.13 e, em seguida, compare-o com 3.11 e 3.14. Rastreie como SequenceLayer1 e SequenceLayer2 recebem annotations e identifique onde a segunda classe perde sua entrada. A tarefa estará concluída quando o comportamento estiver explicado e um teste de regressão cobrir o intervalo de versões afetado.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
Bug report
Bug description:
import abc
from collections.abc import Iterator
from typing import Protocol
# ---- Expected behavior:
class Steppable(metaclass=abc.ABCMeta):
pass
class Module:
@classmethod
def __init_subclass__(cls, **kwargs) -> None:
super().__init_subclass__(**kwargs)
name, annotation, default = "name", str | None, "abc"
cls.__annotations__[name] = annotation
setattr(cls, name, default)
class SequenceLayer1(Module, Steppable):
pass
print(SequenceLayer1.__dict__.get("__annotations__"))
# {'name': str | None}
assert SequenceLayer1.__dict__.get("__annotations__") is not None
# ---- Unexpected behavior:
class CheckpointableIterator(Iterator, Protocol):
pass
isinstance(CheckpointableIterator, Iterator)
class SequenceLayer2(Module, Steppable):
pass
print(SequenceLayer2.__dict__.get("__annotations__"))
# None
assert SequenceLayer2.__dict__.get("__annotations__") is not None
- Failing on 3.12 and 3.13
- Passing on 3.11 and 3.14 (For 3.14 it is expected to have
__dict__["__annotations__"]missing)
CPython versions tested on:
3.12
Operating systems tested on:
Linux
- Linguagem predominante
- Python
- Estrelas
- 77.2k
- Forks
- 36k
- Merge médio
- 1d 9h
- PRs com merge (30d)
- 558
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.
Mais de python/cpython
-
docs pending
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
-
stdlib type-feature
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
-
stdlib type-feature
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
-
build type-bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 76/100
-
stdlib topic-email type-feature
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 70/100
Todas as issues de python/cpython
Issues semelhantes
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 74/100
bancolombia/sentinel#23 ·
-
test md AbertaCI
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 74/100
-
integration:quickjs org:external priority:backlog topic:code-interpreter topic:middleware type:feature
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 74/100
langchain-ai/deepagents#6450 ·
-
bug client
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 88/100
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 74/100