Tracing a class that defines a custom `__class__` appears to remove said property under certain circumstances

Aberta
#98,148 3 comentários 0 reações 0 responsáveis Ver no GitHub

Ninguém assumiu esta issue ainda.

Avaliação

Dificuldade
4/5
Tempo estimado
3-5 dias
Facilidade para iniciantes
42/100
Tipo de issue
Bug
Clareza
Claramente especificada
Status de atividade
Estagnada
Stack de tecnologia
python
Domínio
compilers

Direção de pesquisa

Comece com o reprodutor Python fornecido, concentrando-se em sys.settrace, super() e na propriedade class personalizada. Reproduza a asserção com falha nas versões afetadas do Python e, em seguida, acompanhe o comportamento relevante até que a asserção continue verdadeira durante o tracing. Um teste de regressão deve abranger a combinação relatada.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

interpreter-core type-bug

Tested on 3.7, 3.8, 3.9 and 3.10

It appears that using super() in the class makes the class behave differently when traced:

import sys

def tracer(frame, event, _):
    return tracer
sys.settrace(tracer)


class Foo:
    pass

class FancyFoo:
    def bug(self):
        super()

    @property
    def __class__(self):
        return Foo

assert isinstance(FancyFoo(), Foo)

Remove either the def bug or the settrace call and the assertion passes.

Ref https://github.com/nedbat/coveragepy/issues/1382.

Linguagem predominante
Python
Estrelas
77.2k
Forks
36k
Merge médio
1d 9h
PRs com merge (30d)
558

Guia de contribuição

Abrir o guia de contribuição

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de python/cpython

Todas as issues de python/cpython

Issues semelhantes

Mais issues de Python

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.