Ошибка с пустой переменной python

Пишу личного Telegram Bot'a для сбора статистики по своим аккаунтам market.csgo.com. Основая задача бота - отправлять асинхронно запросы к API и выводить информацию через Telegram. Код:

async def timeout_items(session, dictt, message, stats):
    date = datetime.strftime(datetime.now(), "%d-%m-%Y")
    async with session.get(f'https://market.csgo.com/api/v2/history?key={dictt[1][1]}&date={date}') as resp:
        html = await resp.json()

        timeout_each_sum = 0
        timeout_each_amount = 0

        for i in html['data']:
            if i['stage'] is None:
                pass
            if i['stage'] == '2':
                given_hash = i['market_hash_name']
            if i['stage'] == '5':
                timeout_hash = i['market_hash_name']
                stats.timeout_sum += int(i['received'])
                timeout_each_sum += int(i['received'])
                timeout_each_amount += 1
                stats.timeout_total += 1

                if given_hash == timeout_hash: #Ошибка, если нет given hash
                    pass
                else:
                    async with session.get(f'https://market.csgo.com/api/v2/items?key={dictt[1][1]}') as resp_2:
                        html_2 = await resp_2.json()

                        items_hash = i['market_hash_name']

                        if html_2['items'] is None or timeout_hash != items_hash:
                            await bot.send_message(message.chat.id,
                                                   f'<a href="{dictt[1][0]}">{dictt[0]}</a> : <b>{timeout_each_sum // 100} ₽ </b>\nItems: <i>{timeout_each_amount}</i>',
                                                   disable_web_page_preview=True, parse_mode=types.ParseMode.HTML)
                        else:
                            pass
            else:
                pass

Ошибка:

    if given_hash == timeout_hash: # Ошибка если given hash пустой
UnboundLocalError: local variable 'given_hash' referenced before assignment

Моя проблема заключается в функции async def timeout_items(session, dictt, message, stats): Её задача оповещать меня о НЕ удачной продаже предмета (предмет попадает ко мне в инвентарь и его нужно заного выставить на маркет). Ответ от первого запроса history содержить в себе название предмета market_hash_name статус stage и его цену received. Если с названием и ценой все понятно, то статусов может быть несколько stage = 2 - предмет успешно продался, stage = 5 - предмет не продался и лежит у меня в инвентаре. Из этого ответа я беру возможные статусы

if i['stage'] == '2':
    given_hash = i['market_hash_name']
if i['stage'] == '5':
    timeout_hash = i['market_hash_name']

Минус первого запроса history в том, что если после неудачной продажи выставить предмет заного, то в истории он все так же будет показан как неудачная продажа stage = 5. Для это я делаю второй запрос items, который показывает какие предметы у меня сейчас стоят на продаже. Из этого ответа я беру название items_hash = i['market_hash_name'] и делаю проверку на совпадение по имени предмета:

async with session.get(f'https://market.csgo.com/api/v2/items?key={dictt[1][1]}') as resp_2:
    html_2 = await resp_2.json()

    items_hash = i['market_hash_name']

    if html_2['items'] is None or timeout_hash != items_hash:
        await bot.send_message(message.chat.id,
            f'<a href="{dictt[1][0]}">{dictt[0]}</a> : <b>{timeout_each_sum // 100} ₽ </b>\nItems: <i>{timeout_each_amount}</i>',
            disable_web_page_preview=True, parse_mode=types.ParseMode.HTML)

Если ответ пустой (нет никаких событий) или название предмента не равно названию предмета который выставлен на маркет, значит он сейчас лежит в моем инвентаре и не продается. Это работает отлично и без ошибок. Но может быть такой случай, когда за сутки предмет сначала не продался stage = 5, а затем после повторного выставление продался stage = 2 и в ответе от запроса history у меня 2 элемента одного и того же предмета с двумя разными статусами. Пример:

{
  "success": true,
  "data": [
    {
      "market_hash_name": "Glock-18 | Neo-Noir",
      "time": "1659425141",
      "stage": "5",

    },
    
    {
      "market_hash_name": "Glock-18 | Neo-Noir",
      "time": "1659446766",
      "stage": "2",
    }
  ]
}

Если оставить все так, то бот выполняя скрипт не может найти совпадения из items и делает вывод, что предмет не продался и лежит в инвентаре, хотя его принял покупатель и конечный его статус stage = 2 Для этого я и делаю проверку по market_hash_name взависимости от статуса stage

...

if given_hash == timeout_hash: # Ошибка если given hash пустой
    pass
else:

...

И это работает, только при событии когда предмет был stage = 5 стал stage = 2. Если же предмет просто stage = 5, то вылетает ошибка UnboundLocalError: local variable 'given_hash' referenced before assignment. Понимаю, что проблема в:

if i['stage'] == '2':
    given_hash = i['market_hash_name']

Она пустая и вызывает исключение, как можно обработать это событие?


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