Ошибка с пустой переменной 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']
Она пустая и вызывает исключение, как можно обработать это событие?