python / python/cpython

Improve error messages for invalid `shelve` datum

Aberta
#137,899 4 comentários 1 reação 0 responsáveis Ver no GitHub

Ninguém assumiu esta issue ainda.

extension-modules type-feature
Linguagem predominante
Python
Estrelas
77.2k
Forks
35.9k
Métricas de merge de PRs
Métricas de PR pendentes

Descrição

Feature or enhancement

Proposal:

In https://github.com/python/cpython/issues/137829, I got confused because of the following:

import shelve
import dbm.gnu

db = dbm.gnu.open("myshelf", "c")
db.close()

def serializer(obj, protocol=None):
    pass

def deserializer(data):
    return data.decode("utf-8")

with shelve.open("myshelf", serializer=serializer, deserializer=deserializer) as s:
    s["foo"] = "bar"

The traceback is

Traceback (most recent call last):
  File "/home/arf/Desktop/source-codes/cpython/repro.py", line 17, in <module>
    s["foo"] = "bar"
    ~^^^^^^^
  File "/home/arf/Desktop/source-codes/cpython/Lib/shelve.py", line 138, in __setitem__
    self.dict[key.encode(self.keyencoding)] = serialized_value
    ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: gdbm mappings have bytes or string indices only

I got confused because I thought that the issue stemmed from the key (because of the word "indices") but the error is raised due to the serialized_value type as serializer returns None. IOW, s["foo"] = "bar" above is equivalent to s["foo"] = None. I suggest:

  • changing the error message when the value type is incorrect (namely, don't talk about "indices"). Ideally, we should use "key" and "value" to distinguish the messages.
  • add some "must be [...], not [...]" with the input type.

cc @furkanonder

Has this already been discussed elsewhere?

This is a minor feature, which does not need previous discussion elsewhere

Links to previous discussion of this feature:

No response

Linked PRs
  • gh-138768

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 por Lib/shelve.py na linha 138 e reproduza o exemplo fornecido de shelve/dbm.gnu para rastrear por que um valor serializado inválido produz o erro enganoso. Atualize o texto reportado para distinguir chaves de valores e incluir o tipo recebido; considera-se concluído quando o exemplo identifica claramente o valor inválido.

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

Avaliação

Stack de tecnologia
python
Domínio
databases
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.