13

对于Transcrypt Python to JavaScript 编译器的 3.7.1 版本,我目前正在使用新的@dataclass装饰器。根据 PEP 的摘要,我曾预计==, !=, <, >, >=, <=会得到支持,但似乎并非如此:

from dataclasses import dataclass

@dataclass
class C:
    x: int = 10

一些比较不起作用:

>>> c1 = C(1)
>>> c2 = C(2)
>>> c1 == c2  # ok
False
>>> c1 < c2  # crash
TypeError: '<' not supported between instances of 'C' and 'C'

为什么不支持比较运算符,除了==and !=?还是我忽略了什么?

4

1 回答 1

18

他们这样做,只是不是默认情况下。根据PEP-557

参数为dataclass

...

  • order: 如果为真(默认为假),将生成__lt__, __le__, __gt__, 和方法。__ge__这些按顺序比较类,就好像它是其字段的元组一样。比较中的两个实例必须是相同的类型。如果order为真且 eq为假,ValueError则引发 a。

所以你想要@dataclass(order=True).

于 2018-04-16T13:48:45.683 回答