Size: a a a

2020 November 02

RB

Roman Bolkhovitin in rannts
@nineseconds Серег, кажется ты писал, что у вас pydantic + голый pymongo/motor и жить хорошо.

Вы на уровне репозиториев данные мапите и все остальное с базой делаете, или все таки есть модели с методами save/update/delete и т.д.?
источник

SA

Sergey Arkhipov in rannts
Моделей нет, если не считать объекты pydantic. Читаем из бд - пихаем в pydantic. Когда надо из pydantic что-то сделать, то зовем метод dict
источник

SA

Sergey Arkhipov in rannts
save/update/delete нет, потому что обычно апдейты в духе compare-and-swap, либо батчами. Удаление тоже либо батчами, либо не ломает делать delete_one({"id": mdl._id})
источник

SA

Sergey Arkhipov in rannts
ну то есть методы сделать несложно, просто использоваться они не будут
источник

RB

Roman Bolkhovitin in rannts
Понял, спасибо )
источник

RB

Roman Bolkhovitin in rannts
А отнаследоваться от базовой модели pydantic и напихать туда новых методов это вообще нормально или лучше так не делать?
источник

RB

Roman Bolkhovitin in rannts
а то в нем как-то дофига магии )
источник

SA

Sergey Arkhipov in rannts
Да конечно нормально, так все и делают
источник

AM

Artem Malyshev in rannts
Roman Bolkhovitin
А отнаследоваться от базовой модели pydantic и напихать туда новых методов это вообще нормально или лучше так не делать?
Ты про BaseModel или про родительский класс?
источник

RB

Roman Bolkhovitin in rannts
Artem Malyshev
Ты про BaseModel или про родительский класс?
я про BaseModel )
источник

AM

Artem Malyshev in rannts
Если первое, то это и так основное публичное апи библиотеки.
источник

AM

Artem Malyshev in rannts
источник

RB

Roman Bolkhovitin in rannts
Artem Malyshev
Ты про BaseModel или про родительский класс?
блин, заглянул в "родительский" класс, а там:
    def __pretty__(self, fmt: Callable[[Any], Any], **kwargs: Any) -> Generator[Any, None, None]:
       """
       Used by devtools (https://python-devtools.helpmanual.io/) to provide a human readable representations of objects
       """
       yield self.__repr_name__() + '('
       yield 1
       for name, value in self.__repr_args__():
           if name is not None:
               yield name + '='
           yield fmt(value)
           yield ','
           yield 0
       yield -1
       yield ')'


пойду посплю 🙈
источник

AM

Artem Malyshev in rannts
Roman Bolkhovitin
блин, заглянул в "родительский" класс, а там:
    def __pretty__(self, fmt: Callable[[Any], Any], **kwargs: Any) -> Generator[Any, None, None]:
       """
       Used by devtools (https://python-devtools.helpmanual.io/) to provide a human readable representations of objects
       """
       yield self.__repr_name__() + '('
       yield 1
       for name, value in self.__repr_args__():
           if name is not None:
               yield name + '='
           yield fmt(value)
           yield ','
           yield 0
       yield -1
       yield ')'


пойду посплю 🙈
Я надолго потерял сон посте того, как мой pr в пидантик наконец-то смёржили.
источник

RB

Roman Bolkhovitin in rannts
а его починили чтобы он с 3.9 работал кстати?
источник

AM

Artem Malyshev in rannts
Не знаю, я его выпилил.
источник

SA

Sergey Arkhipov in rannts
Roman Bolkhovitin
а его починили чтобы он с 3.9 работал кстати?
Да
источник

SA

Sergey Arkhipov in rannts
Вообще, конечно, Pydantic невероятно ублюдочно уродлив внутри. И местами адски нелогичен. Скажем, есть класс pydantic.networks.HttpUrl. Угадайте, каким образом можно какой-нибудь http://yandex.ru превратить в экземпляр этого класса.

С другой стороны, все остальное с валидацией в питоне ещё хуже с точки зрения пользователя
источник

SA

Sergey Arkhipov in rannts
Roman Bolkhovitin
блин, заглянул в "родительский" класс, а там:
    def __pretty__(self, fmt: Callable[[Any], Any], **kwargs: Any) -> Generator[Any, None, None]:
       """
       Used by devtools (https://python-devtools.helpmanual.io/) to provide a human readable representations of objects
       """
       yield self.__repr_name__() + '('
       yield 1
       for name, value in self.__repr_args__():
           if name is not None:
               yield name + '='
           yield fmt(value)
           yield ','
           yield 0
       yield -1
       yield ')'


пойду посплю 🙈
Это нормально, кстати. Зато внутри devtools можно печатать с помощью простого "".join(). Генератор нужен для простой работы с кучей глубоко вложенных объектов, уж не знаю, насколько оно реально рационально в случае Pydantic. Но такой подход много где есть, включая шаблонизаторы
источник

SA

Sergey Arkhipov in rannts
Я более того, в одном проекте большой json собираю по тому же принципу. Там гигантские списки больших объектов. Короче, если сунуть в любой сериализатор как есть, то оно все жрет 8гб памяти и работает 3-4 минуты. А "руками" в стиле json lines - 500 мб и работает 1 минуту.

Так что запомните этот подход ;)
источник