Replies: 2 comments
-
Для инициализации перечня атрибутов (_id_attrs) можно использовать
В таком случае не надо переделывать eq базового класса |
Beta Was this translation helpful? Give feedback.
0 replies
-
Идея реализована в рамках этой задачи: #469 |
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
Идея с pydantic хороша, но кажется избыточной в рамках данной библиотеки. Никто никогда не будет проверять соответствие типов полей с присланной ЯМ информацией.
Намного проще и легче использовать средства встроенные в язык. С Python 3.7 у нас есть стандартная библиотека dataclasses.
Инициируя переезд с текущих моделей я преследую следующие цели:
Переезд на dataclasses можно осуществлять в несколько итераций. Первая - это избавление он конструкторов и документации к ним с сохранением всех старых функциональных возможностей. Старое сравнение моделей, их хеширование, доступ к полям, сообщения о новых неизвестных полях. Вторая - новый подход к сериализации и десериализации на десктрипторах.
На текущий момент я уже переписал 1 модель на dataclass, она красиво вписалась в текущий проект. У меня имеются следующие заметки:
__eq__
потому что оно происходит по всем полям (дока). Соответственно каждый декоратор класса будет выглядеть так:@dataclass(eq=False)
. Конечно можно вынести в utils создав свой декоратор над этим и контролировать аргументы с одного места в коде.dataclasses.fields
возвращающая перечень полей, у которых есть имена. Так я смог создать два словаря: известные поля, неизвестные поля. Одни идут в конструктор для создания модели, вторые выводятся в консоль как новые. Повторю, что это находится в базовом классе и теперь нет необходимости в каждом конструкторе вызыватьsuper().handle_unknown_kwargs(self, **kwargs)
._
, существует разница имени поля и имени аргумента. В dataclasses нет возможности задавать псевдонимы для аргументов конструктора. Поэтому при переезде придется отказаться от добавления_
в конец, что собственно не есть плохо. Конечные программисты будут взаимодействовать с полями классов как и раньше. Например,Track.id
.__hash__
. Можно занести это под if, если мы не хотим их переопределять каждый раз, а просто смотреть не были ли они заданы уже при первом сравнении.__eq__
у нас вызывается hash() на левый и правый операнд, а они в свою очередь, перед просчетом хеша, устанавливают перечень атрибутов. Вероятно, теперь при сравнении должна упасть производительность из-за частого вызова просчета хеша, в котором присутствует заморозка вложенных списков.Учтя все заметки выше получаем рабочую библиотеку с поддержкой старой логики и прохождение всех текущих тестов моделей даже при комбинации 1 dataclass'a со всеми старыми моделями
P.S. реализация всего этого приведет к прекращения поддержки Python 3.6
Beta Was this translation helpful? Give feedback.
All reactions