`inspect.getmembers_static` triggers `__getattribute__`

Aberta
#99,673 1 comentário 0 reações 0 responsáveis Ver no GitHub

Ninguém assumiu esta issue ainda.

Avaliação

Dificuldade
3/5
Tempo estimado
1-2 dias
Facilidade para iniciantes
42/100
Tipo de issue
Bug
Clareza
Razoavelmente clara
Status de atividade
Estagnada
Stack de tecnologia
python
Domínio
tooling

Direção de pesquisa

Comece pela implementação de inspect.getmembers_static e pelo trabalho em dir_static referenciado em gh-55979. Reproduza o exemplo de recursão e, em seguida, verifique se a inspeção de membros não aciona mais getattribute por meio de dir; considera-se concluído quando o comportamento relatado estiver corrigido sem alterar as limitações documentadas sobre atributos criados dinamicamente.

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

Descrição

stdlib type-bug

Bug report

inspect.getmembers_static is documented as not triggering __getattribute__, but it can trigger it via dir. For example the following hits the recursion limit:

class A:
    def __getattribute__(self, name: str) -> Any:
        getmembers_static(self)
        return "all attrs exist!"

A().anything

(A workaround for examples like this one is to add the base cases required by dir to __getattribute__:

if name in ("__dict__", "__class__"):
    return object.__getattribute__(self, name)

(The __dict__ case is not always needed depending on the __dir__ implementation.))

Switching getmembers_static to use dir_static (gh-55979) would fix this problem, I believe. getmembers_static already documents that it can't find the dynamically created attributes, etc. that getattr_static can't find, so I don't think such a change would be breaking.

Your environment

  • CPython versions tested on: 3.11.0
  • Operating system and architecture: Linux-based, x86_64
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.