Subclassing PrettyPrinter.format doesn't work in all cases
未关闭
还没有人认领这个 Issue。
stdlib
type-bug
- 主要语言
- Python
- 星标
- 77.2k
- 派生
- 35.9k
- PR 合并指标
- PR 指标待抓取
描述
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
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
首先运行 reproducer 并检查 pprint.PrettyPrinter.format,尤其是它如何处理列出的容器类型及其内容。将每个输出与预期的自定义格式进行比较,然后为 override 被绕过的情况添加回归覆盖。完成的标准是 reproducer 中显示的每个 或 repr 都遵循子类的 format 方法。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- python
- 领域
- tooling
- Issue 类型
- 缺陷
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 活跃度
- 停滞
- 描述清晰度
- 描述清楚
- 新手友好度
- 25/100