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
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
Идея с 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