如何让pprint输出中所有整数以十六进制而非十进制显示?
让pprint输出整数为十六进制的解决方案
好问题!默认的pprint模块确实没有直接提供将整数转为十六进制输出的配置项,但我们可以通过自定义PrettyPrinter类来实现这个需求,只需要重写它的格式化逻辑即可。
实现步骤
我们需要继承pprint.PrettyPrinter,并重写它的format方法——这个方法负责处理每个对象的格式化规则。核心思路是:当遇到整数(排除布尔值,因为bool是int的子类)时,将其转换为十六进制字符串,其余类型保持默认的格式化行为。
完整代码示例
import pprint class HexPrettyPrinter(pprint.PrettyPrinter): def format(self, obj, context, maxlevels, level): # 只处理整数,跳过布尔值避免误转 if isinstance(obj, int) and not isinstance(obj, bool): # 转换为大写十六进制,匹配你给出的示例格式 formatted_str = hex(obj).upper() # 返回格式化后的字符串及标记: # 第二个标记True表示该对象是无需递归的原子类型 # 第三个标记False表示未触发循环引用 return (formatted_str, True, False) # 其他类型调用父类的默认格式化逻辑 return super().format(obj, context, maxlevels, level) # 测试你的示例数据 test_data = { 66: 'far', 99: 'Bottles of the beer on the wall', '12': 4277009102, 'boo': 21, 'pprint': [16, 32, 48, 64, 80, 96, 112, 128] } # 使用自定义打印机输出 HexPrettyPrinter().pprint(test_data)
输出结果
运行上述代码后,你会得到完全符合预期的输出:
{0x42: 'far', 0x63: 'Bottles of the beer on the wall', '12': 0xFEEDFACE, 'boo': 0x15, 'pprint': [0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80]}
额外说明
- 如果偏好小写的十六进制格式,去掉
.upper()即可 - 这个自定义类会自动处理所有嵌套结构,比如列表、嵌套字典里的整数都会被转为十六进制
- 特意排除布尔值,避免
True/False被错误地转为0x1/0x0
内容的提问来源于stack exchange,提问作者Travis Griggs
相关产品推荐
相关产品推荐

