Subclassing PrettyPrinter.format doesn't work in all cases
Personne n'a encore pris cette issue.
- Langage dominant
- Python
- Étoiles
- 77.2k
- Forks
- 35.9k
- Métriques de merge des PR
- Métriques de PR en attente
Description
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
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Commencez par exécuter le reproducer et inspecter pprint.PrettyPrinter.format, en particulier la manière dont il traite les types de conteneurs listés et leur contenu. Comparez chaque sortie avec le formatage personnalisé attendu, puis ajoutez une couverture de régression pour les cas où l’override est contourné. Le travail est terminé lorsque chaque ou repr affiché par le reproducer respecte la méthode format de la sous-classe.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- python
- Domaine
- tooling
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- À l'abandon
- Clarté
- Clairement spécifiée
- Accessibilité débutants
- 25/100