Как стать автором
Обновить

Комментарии 8

Покрутил. Да, удобная штука, спасибо.

предпочитаю pydantic, просто потому что знаком с ним через FastAPI

а еще там типов какое то неприличное количество и он их проверяет в рантайме

правда за счет этого pydantic скорее всего и работает медленнее dataclass-ов, но мне норм

У нас есть и то и то. Pydantic на самом верху в связке с FastAPI, а вот все что бузинес и ниже все на attrs, ибо pydantic просто адски громоздкий.

От себя могу добавить что dataclasses это хорошо, а вот attrs это намного лучше, и по объективным причинам, он никогда не станет частью Питон.

У вас кажется ошибка в примере со сравнением. Все поля, которые добавлены в __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)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий