Объект ‘ListingGenerator’ невозможно повторить с помощью ASYNCPRAW

#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() (хотя в документации сказано иначе).