Как Discord.py управляет объектами?

В discord.py можно создавать объекты discord.ui.Button, прицеплять к ним функции обратного вызова (callback) а так же отсылать их в сообщении. Меня интересует каким образом discord.py хранит эти кнопки, а так же их функции обратного вызова. Я попробовал вывести в консоль id объекта кнопки из её обратного вызова и нажал на одну и ту же кнопку два раза. В обоих случаях id был одинаковым.

# Набор кнопок
class RoleView(discord.ui.View):
    def  __init__(self, guild, db):
        super().__init__(timeout=None)

        # Получение списка ролей
        roles = db.getGuildRoles(guild.id)

        # Добавление кнопок с этими ролями
        for row in roles:
            self.add_item(
                RoleButton(row[0], row[1], row[2], guild.get_role(row[3]), db, guild)
            )

# Кнопка
class RoleButton(discord.ui.Button):
    def __init__(self, label, color, cooldown, role_obj, db, guild):
        super().__init__(label=label, style=getattr(discord.ButtonStyle, color))
        self.role_obj = role_obj
        self.cooldown = cooldown
        self.db = db
        self.guild = guild

    async def callback(self, e):
        print(id(self))

Отправка:

await self.roles_channel.send(
    view = RoleView(ctx.guild, self.db)
)

В итоге получается что discord.py хранит все когда-либо созданные кнопки и все их свойства где-то в памяти? Может ли бот крашнуться из-за нехватки памяти если он создал очень много кнопок?


Ответы (1 шт):

Автор решения: adolf_two

В discord.py, кнопки и их функции обратного вызова хранятся в памяти. Когда создаются объекты кнопок и устанавливаются функции обратного вызова, они сохраняются в памяти бота до тех пор, пока на них есть ссылки или пока процесс бота не завершится.

Кнопок не будет достаточным для вызова проблем с памятью. Так что вряд ли такое случится.

→ Ссылка