Экспорт переменной из функции класса

В классе CreateProduct в функции callback рассчитывается стоимость товара. Полученный результат нужно использовать при нажатии кнопки "Премиум" в функции listener для расчета комиссии. Сейчас price - локальная переменная. Как сделать так, чтобы ее можно было использовать в функции listener.

class CreateProduct(disnake.ui.Modal):
    def __init__(self):
        components = [
            disnake.ui.TextInput(
                label="Желаемый доход",
                placeholder="После вычета комиссий (в рублях)",
                custom_id="price",
                style=TextInputStyle.short
            )
        ]

        super().__init__(title="Расчет стоимости", components=components)

    async def callback(self, inter: disnake.ModalInteraction):

        value = inter.text_values

        price = int(value["price"]) / 0.72
        price = round(price)

        embed = disnake.Embed(
            title="Расчет выполнен",
            color=0x2663F0
        )

        embed.add_field(name="Цена товара для клиента:", value="```" + str(price) + " руб.```")
        embed.add_field(name="Придет на карту:", value="```" + str(card) + " руб.```")

        await inter.response.edit_message(embed=embed, components=[
                disnake.ui.Button(label="На главную", style=disnake.ButtonStyle.green, custom_id="main"),
                disnake.ui.Button(label="Премиум", style=disnake.ButtonStyle.gray, custom_id="premium"),
                disnake.ui.Button(emoji="?", style=disnake.ButtonStyle.gray, custom_id="again")

        ]
                         )

@bot.listen("on_button_click")
async def listener(inter: disnake.MessageInteraction):
    if inter.component.custom_id == "premium":

        embed = disnake.Embed(
            title="Расчет выполнен",
            color=0x2663F0
        )

        if price >= 100 and price <= 499:
            price+=37
        if price >= 500 and price <= 999:
            price+=55
        if price >= 1000 and price <= 2499:
            price+=89
        if price >= 2500 and price <= 4999:
            price+=149
        if price >= 5000 and price <= 9999:
            price+=265
        if price >= 10000 and price <= 19999:
            price+=379
        if price >= 20000:
            price+=449

        embed.add_field(name="Цена товара для клиента:", value="```" + str(price) + " руб.```")

        await inter.response.edit_message(embed=embed, components=[
                disnake.ui.Button(label="На главную", style=disnake.ButtonStyle.green, custom_id="main"),
                disnake.ui.Button(emoji="?", style=disnake.ButtonStyle.gray, custom_id="again")

        ]
                         )

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

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

Вы можете сделать price атрибутом класса CreateProduct, чтобы его можно было использовать в других методах этого класса. Вот как это можно сделать:

class CreateProduct(disnake.ui.Modal):
    def __init__(self):
        components = [
            disnake.ui.TextInput(
                label="Желаемый доход",
                placeholder="После вычета комиссий (в рублях)",
                custom_id="price",
                style=TextInputStyle.short
            )
        ]

        super().__init__(title="Расчет стоимости", components=components)
        self.price = 0

    async def callback(self, inter: disnake.ModalInteraction):

        value = inter.text_values

        self.price = int(value["price"]) / 0.72
        self.price = round(self.price)

        embed = disnake.Embed(
            title="Расчет выполнен",
            color=0x2663F0
        )

        embed.add_field(name="Цена товара для клиента:", value="```" + str(self.price) + " руб.```")
        embed.add_field(name="Придет на карту:", value="```" + str(card) + " руб.```")

        await inter.response.edit_message(embed=embed, components=[
                disnake.ui.Button(label="На главную", style=disnake.ButtonStyle.green, custom_id="main"),
                disnake.ui.Button(label="Премиум", style=disnake.ButtonStyle.gray, custom_id="premium"),
                disnake.ui.Button(emoji="?", style=disnake.ButtonStyle.gray, custom_id="again")

        ]
                         )

@bot.listen("on_button_click")
async def listener(inter: disnake.MessageInteraction):
    if inter.component.custom_id == "premium":

        embed = disnake.Embed(
            title="Расчет выполнен",
            color=0x2663F0
        )

        price = inter.message.interaction.price

        if price >= 100 and price <= 499:
            price+=37
        if price >= 500 and price <= 999:
            price+=55
        if price >= 1000 and price <= 2499:
            price+=89
        if price >= 2500 and price <= 4999:
            price+=149
        if price >= 5000 and price <= 9999:
            price+=265
        if price >= 10000 and price <= 19999:
            price+=379
        if price >= 20000:
            price+=449

        embed.add_field(name="Цена товара для клиента:", value="```" + str(price) + " руб.```")

        await inter.response.edit_message(embed=embed, components=[
                disnake.ui.Button(label="На главную", style=disnake.ButtonStyle.green, custom_id="main"),
                disnake.ui.Button(emoji="?", style=disnake.ButtonStyle.gray, custom_id="again")

        ]
                         )

Обратите внимание, что в этом коде price теперь является атрибутом класса CreateProduct и доступен в любом методе этого класса. В функции listener вы можете получить доступ к price через inter.message.interaction.price. Это предполагает, что inter.message.interaction является экземпляром класса CreateProduct. Если это не так, вам нужно будет найти другой способ передать price из callback в listener.

→ Ссылка