Python值比较的执行逻辑是否有官方语言规范的强制保障?
Python 值比较(
a == b)的规范要求与实现细节 核心结论
Python官方语言规范没有强制要求所有合规实现完全照搬CPython的四步执行顺序,但明确规定了必须满足的行为约束,CPython的实现只是符合这些约束的典型案例。
官方规范的硬约束
虽然《Data Model》和《Value Comparison Expressions》文档没把执行步骤列得那么细,但定了几个不能破的规则:
- 如果对象的富比较方法(比如
__eq__)返回NotImplemented,解释器必须尝试调用另一方的对应方法; - 要是双方的方法都处理不了(都返回
NotImplemented),最终必须回退到身份比较——也就是检查a is b; - 比较操作得符合基本的对称性逻辑(比如
a == b和b == a结果得一致,除非你刻意设计打破对称性,但这属于非常规操作)。
CPython的具体执行逻辑(合规但非强制)
CPython处理a == b的步骤是目前最通用的实现方式,完全踩中了官方规范的要求:
- 如果
b的类型是a类型的子类,优先调用b.__eq__(a)——这是子类优先原则,允许子类覆盖父类的比较逻辑;
- 如果
- 要是上面的调用返回
NotImplemented,就调用a.__eq__(b);
- 要是上面的调用返回
- 如果
a.__eq__(b)也返回NotImplemented,而且之前没调用过b.__eq__(a),那就再调用一次;
- 如果
- 所有方法都处理不了的话,最后就用身份比较兜底。
其他合规实现的灵活性
像PyPy、Jython这类其他Python实现,只要满足官方的核心约束,就算合规,不用完全复刻CPython的步骤。比如有些实现可能在子类检查的细节上有小调整,但必须保证:
- 不会跳过尝试双方的比较方法;
- 最终一定会回退到身份比较;
- 整体行为符合比较操作的基本预期(比如对称性、自反性)。
内容的提问来源于stack exchange,提问作者user2722968
相关产品推荐
相关产品推荐

