据我了解,total_ordering
装饰器functools
不能很好地与从有序类继承的类一起工作:它不会尝试定义比较函数,因为它们已经定义了。
看这个例子:
from functools import total_ordering
from collections import namedtuple
Test = namedtuple('Test',['a','b'])
@total_ordering
class TestOrd(Test):
def __lt__(self,other):
return self.b < other.b or self.b == other.b and self.a < other.a
x = TestOrd(a=1,b=2)
y = TestOrd(a=2,b=1)
print(x < y) # Expected: False
print(x <= y) # False
print(x > y) # True
print(x >= y) # True
print(y < x) # True
print(y <= x) # True
print(y > x) # False
print(y >= x) # False
在所有测试中,只有涉及<
操作员的测试给出了预期的结果。
>
通过添加__gt__ = lambda *_ : NotImplemented
到类定义中,我可以使它们也能正常工作。另一方面,如果我为__le__
or添加类似的定义__ge__
,则相应的测试会因 (for __le__
) 而失败:
TypeError: unorderable types: TestOrd() <= TestOrd()
这使我相信这不是解决问题的正确方法。
因此,问题是:有没有一种适当的方法可以用 total_ordering 重新排序一个类?
(是的,我知道total_ordering
手工完成 's 的工作是微不足道的,而且我知道对于这个例子,定义一个无序namedtuple
的也是微不足道的。)