首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >TypeError:'_asyncio.Future‘对象不可订阅,请使用mongodb异步电动机驱动程序

TypeError:'_asyncio.Future‘对象不可订阅,请使用mongodb异步电动机驱动程序
EN

Stack Overflow用户
提问于 2021-11-03 08:10:13
回答 1查看 78关注 0票数 2

我有一个代码,每当用户发布新消息时,我都会尝试更新他的数据:

代码语言:javascript
运行
复制
@bot.event
async def on_message(message):
    if isinstance(message.channel, discord.DMChannel):
        return
    collection = db[f"{message.guild.id}"]
    coll = db.guilds
    if message.author.bot:
        return
    else:
        if message.channel.id != 796145301013397544:
            if not await coll.count_documents({"_id": message.guild.id}):
                await coll.insert_one({"_id": message.guild.id, "suggest_channel": "None", "message_coins": 0.5, "log_channel": "None", 'prefix': '.', 'ignore_channel': 'None', 'likes': 0})
            message_coins = await coll.find_one({"_id": message.guild.id})["message_coins"]
            if not await collection.count_documents({"_id": message.author.id}):
                await collection.insert_one({"_id": message.author.id, "msg": 0, "happy": 0, "coins": 0, "badge": "Нет", "cookie": 0, "minvoice": 0, "color": 0xFFFFFF, "osebe": "Отсутствует", "age": "Неизвестно"})
            await collection.update_one({"_id": message.author.id}, {"$inc": {"msg": 1}})
            await collection.update_one({"_id": message.author.id}, {"$inc": {"coins": message_coins}})
        else:
            pass
    await bot.process_commands(message)
    asyncio.get_event_loop().run_until_complete(on_message(message))

但是,当它被激活时,我会得到一个TypeError:

代码语言:javascript
运行
复制
Ignoring exception in on_message
Traceback (most recent call last):
File "/app/.heroku/python/lib/python3.9/site-packages/discord/client.py", line 343, in _run_event
await coro(*args, **kwargs)
File "/app/bot.py", line 187, in on_message
message_coins = await coll.find_one({"_id": message.guild.id})["message_coins"]
TypeError: '_asyncio.Future' object is not subscriptable

如何修复此TypeError?

EN

回答 1

Stack Overflow用户

发布于 2021-11-03 08:25:49

这里的问题在于python将解释这行代码的性质。

代码语言:javascript
运行
复制
message_coins = await coll.find_one({"_id": message.guild.id})["message_coins"]

它将看到在coll对象上调用find_one方法,使用下标获取"message_coins“元素,然后将该对象传递给await。然而,这并不是您真正想要的。

代码语言:javascript
运行
复制
message_coins = (await coll.find_one({"_id": message.guild.id}))["message_coins"]

您需要使用插入符来强制此处的操作顺序。因此,通过包装await和方法调用,它告诉python将其传递给await,然后一旦从await调用中获得最终结果,就可以使用下标来定位"message_coins“元素。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69821483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档