#python #discord.py #reddit #praw
#python #discord.py #Reddit #praw
Вопрос:
Я хочу получать мемы из субреддита. Проблема в том, что когда я пытаюсь получить мемы с помощью метода subreddit('memes')
, метод возвращает объект ‘ListingGenerator’, который не может быть итерирован.
Я хотел знать, есть ли какой-либо способ преобразовать это в итерируемый объект или любой другой метод для получения мемов из reddit с помощью ASYNCPRAW.
Вот функция:
async def meme(self, ctx):
subreddit = await reddit.subreddit('memes')
print(type(subreddit))
all_subs = []
print(subreddit.hot(limit=50))
for submission in subreddit.hot(limit=50):
all_subs.append(submission)
random_sub = random.choice(all_subs)
name = random_sub.title
url = random_sub.url
embed = discord.Embed(title=name)
embed.set_image(url=url)
await ctx.send(embed=embed)
Это ошибка, которую я получаю:
Traceback (most recent call last):
File "C:UsersanselAppDataLocalProgramsPythonPython38libsite-packagesdiscordextcommandscore.py", line 85, in wrapped
ret = await coro(*args, **kwargs)
File "C:UsersanselPycharmProjectsTransfer Newscogsmeme.py", line 48, in meme
for submission in subreddit.hot(limit=50):
TypeError: 'ListingGenerator' object is not iterable
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "C:UsersanselAppDataLocalProgramsPythonPython38libsite-packagesdiscordextcommandsbot.py", line 902, in invoke
await ctx.command.invoke(ctx)
File "C:UsersanselAppDataLocalProgramsPythonPython38libsite-packagesdiscordextcommandscore.py", line 864, in invoke
await injected(*ctx.args, **ctx.kwargs)
File "C:UsersanselAppDataLocalProgramsPythonPython38libsite-packagesdiscordextcommandscore.py", line 94, in wrapped
raise CommandInvokeError(exc) from exc
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: TypeError: 'ListingGenerator' object is not iterable
Ответ №1:
В вашей meme
команде вы используете for
цикл для итерации возвращаемого ListingGenerator
, который является асинхронным источником. В этом случае вам нужно будет использовать async for
цикл, чтобы иметь возможность повторять асинхронный источник.
Используя обычный for
цикл, вам не разрешается выполнять итерации по асинхронному источнику, если вы не попытаетесь заблокировать цикл событий, потому for
что вызывает __next__
как блокирующую функцию и не ожидает ее результата.
В документации APRAW есть несколько примеров того, как выполнять итерацию по возвращенному ListingGenerators
.
Ссылки:
Комментарии:
1. Да, спасибо, что указали на это. Другое дело, что после добавления
async
у него все еще была ошибка, и поэтому мне пришлось не передаватьusername
password
переменные and в функцииasyncpraw.Reddit()
(хотя в документации сказано иначе).