gpt4 book ai didi

python - 异步 : TypeError: 'coroutine' object is not subscriptable

转载 作者:行者123 更新时间:2023-12-04 12:36:18 48 4
gpt4 key购买 nike

尝试让我的代码更加异步并得到这个错误:

find = (await loop.run_until_complete(a.finddb()[0]))TypeError: 'coroutine' 对象不可订阅

from telethon import TelegramClient, events, Button, utils, sync
import pymongo
from pymongo import TEXT
import re
import logging
import asyncio

class Search(): # search in mongodb
def __init__(self, search): # connect to mongoDB
self.search = search
self.myclient = pymongo.MongoClient(
"mongodb+srv://:@cluster0.ye4cx.mongodb.net/info?retryWrites=true&w=majority&ssl=true&ssl_cert_reqs=CERT_NONE")
self.mydb = self.myclient["info"]
self.mycol = self.mydb["comics"]


async def searchdb(self): # finds all comics by request
self.mycol.create_index([('title', TEXT)], default_language='english')
self.find = self.mycol.find({"$text": {"$search": self.search}})
if self.find.count() == 0:
return 0
else:
return (self.find)

async def finddb(self): # search info for 1 comics
self.mycol.create_index([('title', TEXT)], default_language='english')
self.find = self.mycol.find({"title": self.search})
return (self.find)

@bot.on(events.NewMessage(pattern=r'(?<=|).*(?=|)')) # command for find comics info
async def find(event):
loop = asyncio.get_event_loop()
a = Search(event.text.replace("|", ""))
find = await loop.run_until_complete(a.finddb()[0])
await event.respond(f'**|{find.get("title")}|**\n\n**Статус перевода**: {find.get("status")}\n**Издатель**: {find.get("publisher")}\n\n**Жанр**: {find.get("genres")}\n**Описание**:\n{find.get("description")}', buttons=[[Button.inline('Ссылки на скачку', b'next')]])

我尝试使用电机,但有同样的问题,但为什么它不起作用?使用 pymongo,它工作完美

新麻烦find = (await a.finddb())[0] TypeError: 'AsyncIOMotorCursor' object is not subscriptable

from telethon import TelegramClient, events, Button, utils, sync
import re
import logging
import motor.motor_asyncio

class Search(): # search in mongodb
def __init__(self, search): # connect to mongoDB
self.search = search
self.myclient = motor.motor_asyncio.AsyncIOMotorClient("mongodb+srv://login:pass@cluster0.ye4cx.mongodb.net/info?retryWrites=true&w=majority&ssl=true&ssl_cert_reqs=CERT_NONE")
self.mydb = self.myclient["info"]
self.mycol = self.mydb["comics"]



async def searchdb(self): # finds all comics by request
self.find = self.mycol.find({"$text": {"$search": self.search}})
print(self.find)
if self.find.count() == 0:
return 0
else:
return (self.find)

async def finddb(self): # search info for 1 comics
self.find = self.mycol.find({"title": self.search})
return (self.find)

@bot.on(events.NewMessage(pattern=r'(?<=|).*(?=|)')) # command for find comics info
async def find(event):
a = Search(event.text.replace("|", ""))
find = (await a.finddb())[0]
print(find)
await event.respond(f'**|{find.get("title")}|**\n\n**Статус перевода**: {find.get("status")}\n**Издатель**: {find.get("publisher")}\n\n**Жанр**: {find.get("genres")}\n**Описание**:\n{find.get("description")}', buttons=[[Button.inline('Ссылки на скачку', b'next')]])

最佳答案

首先让我们从一些一般说明开始。 find 被定义为协程。

async def finddb(self):

您需要等待它才能执行它。

db = await self.finddb()

然后您可以对其返回值进行索引。

db[0]

如果您想继续在一行中完成所有这些操作,则需要将其括在括号中。

(await self.finddb())[0]

现在进入您的实际代码。 find 也是一个协程。你不能在其中启动一个事件循环。当您调用 loop.run_until_complete 时,您将得到一个 RuntimeError,因为循环已经在运行。您也不能等待 run_until_complete,因为它不是协程。 (awaitrun_until_complete 都是运行协程或任务的方式,前者在协程内部使用,后者在协程外部使用。)

你可以减少你的代码

find = (await a.finddb())[0]

如果您只关心它返回的第一个文档,您还可以使用 PyMongo 的 find_one 而不是 find 进一步简化它。

最后,PyMongo 本身不支持异步。您实际上是在编写带有事件循环额外开销的同步代码。如果您想从 asyncio 中受益,您应该考虑使用 Motor相反。

关于python - 异步 : TypeError: 'coroutine' object is not subscriptable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64430306/

48 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com