All streams
Search
Write a publication
Pull to refresh
0
0
Send message

Стоп, почему убирать? Docker compose же нужен для локальной разработки

async with async_session_maker() не должно быть в DAO, он должен передаваться как аргумент в функции или же в конструкторе

def __repr__(self):
  return f"{self.__class__.__name__}(id={self.id}, major_name={self.major_name!r})"

Все, больше ничего не надо делать. Если метод dunder str не определен, то питон автоматом вызывает dunder repr метод.
А прежде чем писать такие статьи, стоит почитать документацию питона. Вы же понимаете что многие люди будут ваши статьи, особенно новички, потом нахватаются от вас плохого кода. Благодарю

    def __str__(self):
        return f"{self.__class__.__name__}(id={self.id}, major_name={self.major_name!r})"

    def __repr__(self):
        return str(self)

Ужас... Можно же просто переопределить метод repr

    @classmethod
    async def find_all(cls):
        async with async_session_maker() as session:
            query = select(cls.model)
            result = await session.execute(query)
            return result.scalars().all()

Автору прежде чем писать гайды, надо почитать документацию, почему не надо создавать сессию в самом DAO
https://docs.sqlalchemy.org/en/20/orm/session_basics.html

admin = get_admin() or user or get_user()

Конечно на вкус и цвет, но вот эта цепочка or как то не очень выглядит, трудно читать. Лучше через простые if elif else

admin = user if user else get_user()

Лучше объекты явно проверять объекты на None, в будущем могут появится баги из за этого

return sum(factors) >= 2

Здесь лучше тоже явно кажется, обычным фориком пробежался и все, понятнее будет программисту который читает твой код

for i in range(max_pages + 1):  
    rsp = client.get_all_users(page=page, limit=limit)
    if not rsp.get("user_ids"):
        break
    if i >= max_pages:
        raise RuntimeError("Too many pagination elements")
    yield rsp["user_ids"]

Зачем это условие с if i >= max_pages, просто убери в range +1 и все. оно же для каждой итерации будет выполняться...

def find(path: str, dict_: dict):
    keys = path.split(".")
    data = dict_
    for key in keys:
        try:
            data = data.get(key)
        except AttributeError:
            return None
    return data

bruh...

Грубо говоря, можешь передать часть аргументов в начале, а часть потом передать

Какой ты нафиг программист?

Прочел его историю. Чуть не расплакался

Посмотрел исходный код, либо здесь я ничего не понял. Все равно не понял. Непонятные названия переменных, лишние абстракции, овер дофига уровни вложенности. не соблюдение pep8(понимаю, автор пишет всего лишь 2 недели, но пусть хотя бы с snake_case можно же писать код), странные тесты.

Автор книги слышал о PEP 8?

От такого сахара можно диабет заработать :0

Плохие привычка которая у меня была на самом начале - это учить все одновременно. Помню изучал java, python, sql, алгоритмы одновременно. Из за этого у меня была каша в голове. За двумя зайцами погонишься, ни одного не поймаешь, как говорится

Походу он из Руби перешел на Пайтон

На чем разрабатываете бота? Думаю, это Python.

Сделано на конструкторе, мдааа...

Забыли сказать про главную проблему типизации.
Если объект на тип который вы ссылаетесь, еще не определён, можно его тип взять в кавычки.

Теперь в 3.10 можно указывать в методе класса, сам класс.

class Foo:
  def do_something() -> Foo:
		return Foo()

Отсылка к Дейлу Карнеги, уважуха

Спасибо за статью! Как раз хотел попробовать sqlmodel для своих проектов (@^◡^)

Information

Rating
Does not participate
Registered
Activity