对于不同类型的对象的排序,建议的Python语义是什么?换句话说,当一个自定义编写的比较方法(使用rich comparisons例如__lt__
时)应该实现什么行为,但也许在Python 2中使用'差'比较__cmp__
时遇到与self
不同类型的对象?
TypeError
?foo < bar
和foo.__lt__
不知道bar
的类型,它可以回归到bar.__gt__
吗?3 < "3"
?PEP 207显然为可以的实现方式留下了很多自由,但是我希望可能会有一些指导如何应该实现帮助互操作。
答案 0 :(得分:0)
在撰写问题时,“类似问题”列表让我了解this post。它提到NotImplemented
作为丰富比较的返回值(并非例外)。在文档中搜索此关键字也会显示相关部分:
NotImplemented
- 此类型具有单个值。有一个具有此值的对象。可以通过内置名称NotImplemented
访问此对象。如果数值方法和丰富的比较方法未实现所提供操作数的操作,则它们可能会返回此值。 (然后,解释器将尝试反射操作或其他一些后备操作,具体取决于操作员。)其真值是真的。
如果丰富的比较方法没有实现给定参数对的操作,则它可以返回单例
NotImplemented
。按照惯例,返回False
和True
以进行成功比较。但是,这些方法可以返回任何值,因此如果在布尔上下文中使用比较运算符(例如,在if语句的条件下),Python将在值上调用bool()以确定结果是否为true或者是假的。
如果函数无法比较特定的对象组合,则应返回对
Py_NotImplemented
的新引用。
这回答了我原始问题的第2点和第3点,至少对于丰富的比较场景。 __cmp__
的文档根本没有提到NotImplemented
,这可能就是我最初错过的原因。所以这是切换到丰富比较的另一个原因。
我仍然不确定返回该值是否优先发明订单。我想很大程度上取决于其他对象可能有什么想法。而且我担心,为了实现任何类型的理智订单,可能需要进行大量合作。但也许其他人可以更多地了解我问题的其他部分。