Subclassing PrettyPrinter.format doesn't work in all cases
Ninguém assumiu esta issue ainda.
- Linguagem predominante
- Python
- Estrelas
- 77.2k
- Forks
- 35.9k
- Métricas de merge de PRs
- Métricas de PR pendentes
Descrição
Bug report
Bug description:
See also the earlier fixed https://github.com/python/cpython/issues/73036. This appears to have only been a partial fix, or it has regressed.
import collections
import pprint
import types
SENTINAL = object()
class _hashable:
def __hash__(self):
return 1
HASHABLE_SENTINAL = _hashable()
class CustomPrettyPrinter(pprint.PrettyPrinter):
def format(self, obj, context, maxlevels, level):
if obj is SENTINAL:
return "SENTINAL", True, False
elif obj is HASHABLE_SENTINAL:
return "HASHABLE_SENTINAL", True, False
else:
return super().format(obj, context, maxlevels, level)
if __name__ == "__main__":
printer = CustomPrettyPrinter(sort_dicts=False)
test_data = {
"item": SENTINAL,
"dict": {"a": SENTINAL},
"dict_key": {HASHABLE_SENTINAL: 1},
"OrderedDict": collections.OrderedDict({"a": SENTINAL}),
"OrderedDict_key": collections.OrderedDict({HASHABLE_SENTINAL: 1}),
"list": [SENTINAL],
"tuple": (SENTINAL,),
"set": {SENTINAL},
"frozenset": frozenset({SENTINAL}),
"mappingproxy": types.MappingProxyType({"a": SENTINAL}),
"mappingproxy_key": types.MappingProxyType({HASHABLE_SENTINAL: 1}),
"SimpleNamespace": types.SimpleNamespace(a=SENTINAL),
"defaultdict": collections.defaultdict(list, {"a": SENTINAL}),
"defaultdict_key": collections.defaultdict(list, {HASHABLE_SENTINAL: 1}),
"Counter": collections.Counter({"a": SENTINAL}),
"Counter_key": collections.Counter({HASHABLE_SENTINAL: 1}),
"deque": collections.deque([SENTINAL]),
}
printer.pprint(test_data)
This outputs:
{'item': SENTINAL,
'dict': {'a': SENTINAL},
'dict_key': {HASHABLE_SENTINAL: 1},
'OrderedDict': OrderedDict({'a': <object object at 0x1041f4660>}),
'OrderedDict_key': OrderedDict([(HASHABLE_SENTINAL, 1)]),
'list': [SENTINAL],
'tuple': (SENTINAL,),
'set': {<object object at 0x1041f4660>},
'frozenset': frozenset({<object object at 0x1041f4660>}),
'mappingproxy': mappingproxy({'a': <object object at 0x1041f4660>}),
'mappingproxy_key': mappingproxy({HASHABLE_SENTINAL: 1}),
'SimpleNamespace': namespace(a=<object object at 0x1041f4660>),
'defaultdict': defaultdict(<class 'list'>,
{'a': SENTINAL}),
'defaultdict_key': defaultdict(<class 'list'>,
{HASHABLE_SENTINAL: 1}),
'Counter': Counter({'a': <object object at 0x1041f4660>}),
'Counter_key': Counter({<__main__._hashable object at 0x1045e4d70>: 1}),
'deque': deque([<object object at 0x1041f4660>])}
Every instance of < in that output is a bug.
CPython versions tested on:
3.13
Operating systems tested on:
macOS
Linked PRs
- gh-133238
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 executando o reproducer e inspecionando pprint.PrettyPrinter.format, especialmente como ele lida com os tipos de contêiner listados e seus conteúdos. Compare cada saída com a formatação personalizada esperada e, em seguida, adicione cobertura de regressão para os casos em que o override é ignorado. O trabalho estará concluído quando cada ou repr mostrado pelo reproducer respeitar o método format da subclasse.
Escrita pelo modelo de indexação a partir do texto da issue.
Avaliação
- Stack de tecnologia
- python
- Domínio
- tooling
- Tipo de issue
- Bug
- Dificuldade
- 4/5
- Tempo estimado
- 3-5 dias
- Status de atividade
- Estagnada
- Clareza
- Claramente especificada
- Facilidade para iniciantes
- 25/100