我试图用@dataclass在两个整数值之间进行一些比较。但它显示出一些奇怪的结果。
@dataclass(order=True)
class PersonNewSlry:
sort_index: int = field(init=False)
salary: int
name: str
address: str
def __post_init__(self):
self.sort_index = self.salary
p_slry_1 = PersonNewSlry(75000, "Max" , "Main St 123")
p_slry_2 = PersonNewSlry(75000, "Jules", "Main St 456")
print("== : ", p_slry_1 == p_slry_2)
print("<= : ", p_slry_1 <= p_slry_2)
print("< : ", p_slry_1 < p_slry_2)
print(">= : ", p_slry_1 >= p_slry_2)
print("> : ", p_slry_1 > p_slry_2)
结果是:
== : False
<= : False
< : False
>= : True
> : True
我在Python 3.10和3.8.8中尝试过,但结果是一样的。
我预计会得出以下结果:
== : True
<= : True
< : False
>= : True
> : False
我只有在做以下事情时才能得到想要的结果:
name: str = field(compare=False)
address: str = field(compare=False)
我想我可以用sort_index定义__post_init__
方法,并比较这两个值。我是不是误解了什么?
sort_index
没有特殊意义——它和其他字段一样。比较时会考虑它,但未标记为非比较的其他字段也会考虑它。您的测试正在比较(75000, 75000, "Max", "Main St 123")
和(75000, 75000, "Jules", "Main St 456")
;元组的前两个元素相等,因此比较的结果取决于第三个字段,其中"Max" >= "Jules"
;因此p_slry_1 >= p_slry_2
。
要定义类的总顺序,必须定义六个比较运算符(或者只定义一个比较运算符和一个相等运算符,然后用@functools.total_ordering
修饰类(。为了使类可排序,只定义__lt__
就足够了。
通过有序的数据类,这些方法是为您生成的;但是你可以覆盖它们。或者,您必须标记任何不想进行比较的字段,就像您在上一个代码段中所做的那样。
还要注意,如果salary
未标记为非比较,则不需要您的sort_field
。如果salary
是唯一的比较字段,则将比较(75000)
和(75000)
。如果你也有sort_order
,那么你有两个值相同的比较字段:(75000, 75000)
和(75000, 75000)
,我找不到任何用处。如果您希望有一个从其他字段计算但不明确存在的标准,那么将sort_field
作为唯一的比较字段是有意义的;不过在这一点上,我可能只会定义一个新的总排序。