我正在尝试使用Python 3.7中的新dataclasses
。
dataclass
装饰器可以传递参数来控制添加到类中的dunder函数。
由于某种原因,装饰器似乎不会对eq=False
参数引发TypeError
异常。
根据文档:
eq: If true (the default), an __eq__ method will be generated.
This method compares the class as if it were a tuple of its fields, in order.
Both instances in the comparison must be of the identical type
如果我理解正确,如果我传递eq = False
,则不会添加__eq__
函数,并且当比较同一类的两个实例时应该抛出TypeError
。相反,eq
参数似乎没有任何效果。
@dataclass(eq = False)
class Number:
val: int
a = Number(1)
b = Number(2)
c = Number(1)
a == b
False
a == c
False
以上代码不会引发TypeError
错误,并始终评估为False
。
@dataclass()
class Number:
val: int
a = Number(1)
b = Number(2)
c = Number(1)
a
Number(val = 1)
a == b
False
a == c
True
其他参数(如:
order
,repr
)似乎按预期运作。@dataclass(order = False, repr = False)
class Number:
val:int
a = Number(1)
b = Number(2)
c = Number(1)
a
<__main__.Number object at 0x7fe1036c8b38>
a < b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'Number' and 'Number'
我是否有什么理解上的疏漏?
我正在使用docker镜像python/rc-stretch
@dataclass(eq = False, order = False)
来检查第一个案例吗? - RedEyedTypeError
。 - xssChauhanpython3.7
上无法重现,因为一旦我将eq = False
设置好后,任何使用==
进行比较的结果都会返回False
。我会查看文档以确定这是否是预期行为。 - Arne