Я пробовал новый dataclasses
в Python 3.7
В декоратор dataclass
могут передаваться аргументы для управления функциями dunder, которые добавляются в класс.
По какой-то причине декоратор, похоже, не вызывает TypeError
для аргумента eq=False
.
Согласно документации:
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'
Есть ли пробел в моем понимании?
Я использую образ докера python/rc-stretch