Python数据类出现问题.两个值之间的比较没有显示出所需的结果



我试图用@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作为唯一的比较字段是有意义的;不过在这一点上,我可能只会定义一个新的总排序。

相关内容

  • 没有找到相关文章

最新更新