不同类型的对象的比较

时间:2015-01-05 21:54:25

标签: python comparison compare

对于不同类型的对象的排序,建议的Python语义是什么?换句话说,当一个自定义编写的比较方法(使用rich comparisons例如__lt__时)应该实现什么行为,但也许在Python 2中使用'差'比较__cmp__时遇到与self不同类型的对象?

  1. 是否应该发明订单,例如“所有意外的对象都比我自己的类型要少”?
  2. 是否应抛出TypeError
  3. 是否有一些简单的方法让其他对象尝试,即如果foo < barfoo.__lt__不知道bar的类型,它可以回归到bar.__gt__吗?
  4. 是否有任何关于如何实现不同类型对象的理智排序的指南,最好是total order但可能更少?
  5. 文档中是否有任何部分解释了为什么3 < "3"
  6. PEP 207显然为可以的实现方式留下了很多自由,但是我希望可能会有一些指导如何应该实现帮助互操作。

1 个答案:

答案 0 :(得分:0)

在撰写问题时,“类似问题”列表让我了解this post。它提到NotImplemented作为丰富比较的返回值(并非例外)。在文档中搜索此关键字也会显示相关部分:

Python 2 data model

  

NotImplemented - 此类型具有单个值。有一个具有此值的对象。可以通过内置名称NotImplemented访问此对象。如果数值方法和丰富的比较方法未实现所提供操作数的操作,则它们可能会返回此值。 (然后,解释器将尝试反射操作或其他一些后备操作,具体取决于操作员。)其真值是真的。

later on

  

如果丰富的比较方法没有实现给定参数对的操作,则它可以返回单例NotImplemented。按照惯例,返回FalseTrue以进行成功比较。但是,这些方法可以返回任何值,因此如果在布尔上下文中使用比较运算符(例如,在if语句的条件下),Python将在值上调用bool()以确定结果是否为true或者是假的。

PEP 207

  

如果函数无法比较特定的对象组合,则应返回对Py_NotImplemented的新引用。

这回答了我原始问题的第2点和第3点,至少对于丰富的比较场景。 __cmp__的文档根本没有提到NotImplemented,这可能就是我最初错过的原因。所以这是切换到丰富比较的另一个原因。

我仍然不确定返回该值是否优先发明订单。我想很大程度上取决于其他对象可能有什么想法。而且我担心,为了实现任何类型的理智订单,可能需要进行大量合作。但也许其他人可以更多地了解我问题的其他部分。