python / python/cpython

unittest.mock.patch.object holds references for too long

Aberta
#133,423 10 comentários 0 reações 0 responsáveis Ver no GitHub

Ninguém assumiu esta issue ainda.

performance stdlib type-bug
Linguagem predominante
Python
Estrelas
77.2k
Forks
36k
Métricas de merge de PRs
Métricas de PR pendentes

Descrição

Bug report

Bug description:
import sys
from unittest import mock
import json

def main():
    obj = 'asdfa' * 2000

    print("BEGIN", sys.getrefcount(obj))
    for i in range(10):
        with mock.patch.object(json, 'dumps', return_value=3):
            from json import dumps
            dumps(obj)
    del dumps
    print("END", sys.getrefcount(obj))
    import gc; gc.collect()
    print("AFTERGC", sys.getrefcount(obj))


if __name__ == '__main__':
    main()

The code prints:

BEGIN 2
END 12
AFTERGC 2

Because it is the user's data that is leaked, the leaked object could be huge and could cause non-trivial problems.

CPython versions tested on:

3.13

Operating systems tested on:

Linux

Linked PRs
  • gh-139937

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.

Direção de pesquisa

Comece com unittest.mock.patch.object e a reprodução fornecida; em seguida, leia o PR vinculado gh-139937 para acompanhar a investigação atual. Verifique as contagens de referências antes e depois de contextos de patch repetidos e da coleta de lixo; considera-se concluído quando o objeto do usuário não permanecer mais referenciado após o fim dos contextos.

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

Avaliação

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

Receba novas issues na sua caixa de entrada

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