Inconsistency in handling None handlers in the Python and C implementations of pickle
Ninguém assumiu esta issue ainda.
- Linguagem predominante
- Python
- Estrelas
- 77.2k
- Forks
- 36k
- Merge médio
- 1d 9h
- PRs com merge (30d)
- 558
Descrição
In the Python implementation of pickle setting some handlers to None causes a fallback to other methods.
- Setting
Pickler.reducer_overrideto None has the same effect as not setting this attribute -- falling back to other methods. - Setting the
dispatch_tableto None leads to falling back to__reduce_ex__. - Setting the
__reduce_ex__attribute to None leads to falling back to__reduce__. - Setting the
__setstate__attribute to None leads to falling back to the default implementation of__setstate__(setting__dict__and slots).
In the C implementation all this leads to TypeError: 'NoneType' object is not callable.
The copy module follows the Python implementation of pickle, except that it fails for any false value of __reduce__, not just None.
In most other code setting a dunder method to None leads to a TypeError (either raise explicitly or just generic "'NoneType' object is not callable").
We should decide what behavior should be in the pickle and copy module. On one hand, the Python implementation was primary. On other hand, it was inconsistent between the pickle and copy modules and was already changed in the past, the C implementation of pickle is now used by most users, and it is more consistent with other code.
See also:
https://mail.python.org/archives/list/python-dev@python.org/thread/YGAK34DRWJFSIV2VZ4NC2J24XO37GCMM/
https://docs.python.org/3.10/reference/datamodel.html#id2
https://github.com/python/cpython/issues/70146
https://github.com/python/cpython/issues/55781
https://github.com/python/cpython/issues/60755
Linked PRs
- gh-103035
- gh-109498
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
Comece lendo as implementações em Python e C de pickle e do módulo copy; em seguida, revise os pull requests vinculados gh-103035 e gh-109498. Para considerar o trabalho concluído, é necessário chegar a um comportamento acordado para os handlers None e garantir um tratamento consistente entre todas as implementações afetadas.
Escrita pelo modelo de indexação a partir do texto da issue.
Avaliação
- Stack de tecnologia
- c, python
- Domínio
- backend
- Tipo de issue
- Bug
- Dificuldade
- 5/5
- Tempo estimado
- Mais de uma semana
- Status de atividade
- Estagnada
- Clareza
- Precisa de esclarecimento
- Facilidade para iniciantes
- 25/100