我经常使用namedtuple类。我今天一直在想是否有一种很好的方法可以为这样的类实现自定义排序,即使默认排序键不是 namedtuple 的第一个元素(然后是第二个、第三个等)。
我的第一个直觉是实现__lt__
并__eq__
让total_ordering
剩下的事情(它填写 le, ne, gt, ge):
from collections import namedtuple
from functools import total_ordering
@total_ordering
class B(namedtuple('B', 'x y')):
def __lt__(self, other):
return self.y < other.y
然而:
def test_sortingB():
b1 = B(1, 2)
b2 = B(2, 1)
assert b2 < b1 # passes
assert b2 <= b1 # fails
哦,对了……只有在缺少total_ordering
其他方法时才填写。由于 tuple/namedtuple 有这样的方法,total_ordering 没有为我做任何事情。
所以我想我的选择是
- 停止使用 namedtuple 并构建我自己的无聊类,继续使用 total_ordering
- 继续使用 namedtuple 并实现所有 6 种比较方法
- 继续使用 namedtuple 并插入一个排序值作为第一个字段。幸运的是,我没有太多的类实例,但通常我只是依靠字段的顺序来初始化它们,这可能很讨厌。也许这是一个坏习惯。
有关解决此问题的最佳方法的建议?