Я пробовал новый dataclasses
в Python 3.7
Декоратору dataclass
могут быть переданы аргументы для управления дополнительными функциями, которые добавляются к классу.
По какой-то причине декоратор, похоже, не вызывает 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
@dataclass(eq = False, order = False)
проверить первый случай? - person RedEyed   schedule 29.06.2018TypeError
на ‹или›. - person xssChauhan   schedule 29.06.2018python3.7
, поскольку после того, как я установилeq = False
, любое сравнение с использованием==
всегда возвращаетFalse
. Я проверю документ, соответствует ли это ожидаемому поведению. - person Arne   schedule 29.06.2018