python / python/cpython

Add copyreg.copy() and copyreg.deepcopy()

Aberta
#153,612 0 comentários 0 reações 0 responsáveis Ver no GitHub

Ninguém assumiu esta issue ainda.

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

Descrição

Feature or enhancement

Proposal:

Add two registration functions to copyreg, following the copyreg.pickle() precedent:

  • copyreg.copy(type, function) — registers the shallow copy function for objects of type type; called as function(obj), like __copy__.
  • copyreg.deepcopy(type, function) — registers the deep copy function; called as function(obj, memo), like __deepcopy__.

copy.copy() and copy.deepcopy() use the registered functions in preference to the special methods and the pickle interfaces. Registration is by exact type and does not affect pickling. This allows customizing copying of instances of types that cannot be modified — for example, treating an external library's immutable objects as atomic:

copyreg.deepcopy(thirdparty.Handle, lambda obj, memo: obj)

Today the only way to customize copying of a foreign type is copyreg.pickle(), which forces copy and pickle semantics to be the same. The private _copy_dispatch and _deepcopy_dispatch tables have been monkey-patched in the wild for lack of a public API — even by our own test_descr. The new registries replace this non-public way; _deepcopy_dispatch is now removed, as _copy_dispatch already was in gh-128118.

This was requested in gh-141737. Implementation is ready; PR to follow.

Has this already been discussed elsewhere?

Companion of PEP 837, whose Rationale notes that registries for other protocols will be proposed separately: https://discuss.python.org/t/pep-837-extensible-json-serialization/108124

Links to previous discussion of this feature:
  • gh-141737 — the direct feature request
  • gh-128118 — removal of the historical _copy_dispatch table
Linked PRs
  • gh-153613

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 lendo a proposta de copyreg.copy() e copyreg.deepcopy() juntamente com os pontos de entrada copy.copy() e copy.deepcopy(). Revise o PR vinculado gh-153613 e verifique se os registros de tipos exatos têm precedência sobre métodos especiais e interfaces de pickle, enquanto a cópia permanece separada do pickling.

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

Avaliação

Stack de tecnologia
python
Domínio
tooling
Tipo de issue
Funcionalidade
Dificuldade
3/5
Tempo estimado
1-2 dias
Status de atividade
Estagnada
Clareza
Claramente especificada
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.