我正在编写一个个人电报机器人来收集我的market.csgo.com帐户的统计数据。该机器人的主要任务是向 API 发送异步请求并通过 Telegram 显示信息。一切正常,但问题在于全局变量,或者更确切地说,它们的计数不正确。我的功能之一的示例:
...
import asyncio
import aiohttp
sale_total_sum = 0
amount_total_items = 0
async def get_on_sale(session, dictt, message):
global sale_total_sum
global amount_total_items
async with session.get(f'https://market.csgo.com/api/v2/items?key={dictt[1][1]}') as resp:
html = await resp.json()
if html['items'] is None:
pass
else:
each_sale_sum = 0
each_amount_items = 0
for i in html['items']:
sale_total_sum += i['price']
each_sale_sum += i['price']
each_amount_items += 1
amount_total_items += 1
try:
await bot.send_message(message.from_user.id,
f'<a href="{dictt[1][0]}">{dictt[0]}</a> : <b>{each_sale_sum} ₽</b>\nItems: <i>{each_amount_items}</i>',
disable_web_page_preview=True, parse_mode=types.ParseMode.HTML)
except exceptions.RetryAfter as e:
await asyncio.sleep(e.timeout)
@dp.message_handler(content_types=['text'])
async def Main(message):
profiles = users()
async with aiohttp.ClientSession(trust_env=True) as session:
tasks = []
if message.text == 'On Sale 💰':
await bot.send_message(message.from_user.id, 'Information request. Wait..')
for i in profiles.items():
task = asyncio.ensure_future(get_on_sale(session, i, message))
tasks.append(task)
await asyncio.gather(*tasks)
await bot.send_message(message.from_user.id,
f'<b>Total on sale: {sale_total_sum} ₽\nTotal items: {amount_total_items}\nBot start at: {start}</b>',
reply_markup=kb_client, parse_mode=types.ParseMode.HTML)
executor.start_polling(dp, skip_updates=True)
函数结果:
Account_1: 100 ₽
Items: 1
Account_2: 200 ₽
Items: 2
Account_3: 300 ₽
Items: 3
Total on sale: 600 ₽
Total items: 6
该机器人在轮询模式下工作executor.start_polling(dp, skip_updates=True)。如果在包含后第一次调用该函数async def get_on_sale,那么它的最终计数Total on sale: 600 ₽ Total items: 6将是正确的,但随后的调用会使这个数量翻倍,实际上并非如此:
Account_1: 100 ₽
Items: 1
Account_2: 200 ₽
Items: 2
Account_3: 300 ₽
Items: 3
Total on sale: 1200 ₽
Total items: 12
我知道问题出在全局变量global sale_total_sum和global amount_total_items. 但是,如果您改用简单变量,它们将被简单地覆盖,而不是按照我的需要进行汇总。因此,我想问 -有没有办法在函数结束后以某种方式重置或重新分配这些全局变量为 0?这样在下一次调用时数据将是正确的。谢谢你。
get_on_sale当所有函数都在一次调用中执行时,您应该拥有此数据的生命周期Main。创建一个包含两个字段的对象并将其作为参数传递给,
get_on_sale以便多次调用此函数来更改它。完成所有调用后,使用结果: