对于Transcrypt Python to JavaScript compiler的{3.7}版本,我目前正在使用新的@dataclass
装饰器。根据{{3}},我原本预计会支持==, !=, <, >, >=, <=
,但似乎并非如此:
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'
为什么不支持比较运算符,==
和!=
除外?或者我忽略了什么?
答案 0 :(得分:13)
他们这样做,而不是默认情况下。每PEP-557:
dataclass
的参数是:...
order
:如果为true(默认值为False),则会生成__lt__
,__le__
,__gt__
和__ge__
方法。这些比较了 类似于它的字段的元组,按顺序排列。两个实例都在 比较必须是相同的类型。如果order
为真,那么eq
为false,引发ValueError
。
所以你想要@dataclass(order=True)
。