为什么pprint打印Matplotlib的Annotation对象类名与print结果不一致?
解答
核心结论
这不是pprint的异常行为,该现象由Matplotlib的Annotation类实现逻辑、以及print和pprint的打印规则差异导致。
具体原因
- 变量本身类型没有变化
你可以额外执行print(type(ret))验证,输出一定是<class 'matplotlib.text.Annotation'>,ret从始至终都是Annotation类的实例,不存在类型变化的情况。 - 两个打印函数的调用规则不一样
- 普通
print打印对象时默认调用对象的__str__魔术方法。Matplotlib的Annotation类单独实现了自定义__str__逻辑,输出会主动标注自身类名Annotation,同时取用箭头起始点的参数,所以print(ret)输出Annotation(2, 1, '')。 pprint.pprint打印对象时默认调用对象的__repr__魔术方法生成格式化内容,这是pprint本身的设计规范。但目前Matplotlib的Annotation类没有单独实现自定义__repr__,直接继承了父类Text的__repr__实现,父类的实现固定输出类名Text,取用的是注释文本的位置参数(也就是你代码里的(4,1)),所以pprint.pprint(ret)就输出了Text(4, 1, '')。
该问题本质是Matplotlib的Annotation类没有对齐__str__和__repr__的实现,不属于pprint的设计缺陷。
内容的提问来源于stack exchange,提问作者sdbbs
相关产品推荐
相关产品推荐

