Комментарии 8
Тем, кто проникся dataclasses, имеет смысл взглянуть на attrs, который ещё круче: https://attrs.org/en/stable/why.html#data-classes
Покрутил. Да, удобная штука, спасибо.
предпочитаю pydantic, просто потому что знаком с ним через FastAPI
а еще там типов какое то неприличное количество и он их проверяет в рантайме
правда за счет этого pydantic скорее всего и работает медленнее dataclass-ов, но мне норм
У вас кажется ошибка в примере со сравнением. Все поля, которые добавлены в __eq__
также добавляются и в __lt__
. В результате если создать два объекта с разными именами, то ваш код уже не сработает.
p1 = Person(age=30)
p2 = Person(age=20, first_name='Bob')
p1 > p2 # False
Будет использовая весь tuple, и имя будет сравниваться раньше чем возраст.
Не хватило только уточнения, что dataclass не меняет синтаксис написания классов, а, по сути, является готовым интерфейсом, у которого в __init__ уже прописано брать kwargs и устанавливать атрибуты инстанса. По сути, это хэлпер, который устанавливает значение своих атрибутов при инициализации.
Чтобы сравнение работало, надо или sort_index поднять на первое место:
@dataclass(order=True)
class Person:
sort_index: int = field(init=False, repr=False)
first_name: str = "Ahmed"
last_name: str = "Besbes"
age: int = 30
job: str = "Data Scientist"
Или остальным полям отключить участие в сравнениях (по-умолчанию True):
first_name: str = field(default="Ahmed", compare=False)
9 причин использовать dataclasses в Python