asyncio: TypeError: 'coroutine' object is not subscriptable
asyncio: TypeError: 'coroutine' object is not subscriptable
尝试让我的代码更加异步并得到这个错误:
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()
然后您可以对其 return 值进行索引。
db[0]
如果您想继续在一行中完成所有这些操作,则需要将其括在括号中。
(await self.finddb())[0]
现在进入您的实际代码。 find
也是协程。你不能在其中启动一个事件循环。当您调用 loop.run_until_complete
时,您将得到一个 RuntimeError
,因为循环已经 运行ning。您也不能 await run_until_complete
因为它不是协程。 (await
和 run_until_complete
都是 运行 协程或任务的方式。前者在协程内部使用;后者在协程外部使用。)
您可以将代码缩减为
find = (await a.finddb())[0]
如果您只关心第一个文档 returns.
,您还可以使用 PyMongo 的 find_one
而不是 find
进一步简化它
最后,PyMongo 本身不是 asyncio-aware。您实际上是在编写带有事件循环额外开销的同步代码。如果您想从 asyncio 中受益,您应该考虑使用 Motor。
尝试让我的代码更加异步并得到这个错误:
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()
然后您可以对其 return 值进行索引。
db[0]
如果您想继续在一行中完成所有这些操作,则需要将其括在括号中。
(await self.finddb())[0]
现在进入您的实际代码。 find
也是协程。你不能在其中启动一个事件循环。当您调用 loop.run_until_complete
时,您将得到一个 RuntimeError
,因为循环已经 运行ning。您也不能 await run_until_complete
因为它不是协程。 (await
和 run_until_complete
都是 运行 协程或任务的方式。前者在协程内部使用;后者在协程外部使用。)
您可以将代码缩减为
find = (await a.finddb())[0]
如果您只关心第一个文档 returns.
,您还可以使用 PyMongo 的find_one
而不是 find
进一步简化它
最后,PyMongo 本身不是 asyncio-aware。您实际上是在编写带有事件循环额外开销的同步代码。如果您想从 asyncio 中受益,您应该考虑使用 Motor。