discord.py SyntaxError: ‘await’ вне асинхронной функции

#python #discord #discord.py

#питон #Discord #discord.py

Вопрос:

Я получил ошибку во всем приведенном ниже коде. Я хотел бы обратиться за помощью в связи с этой ошибкой. Могу ли я обратиться за помощью, просмотрев приведенный ниже код?

 async def ban(ctx, member: discord.Member, *, reason: typing.Optional[str] = "사유 없음."):
    await ctx.message.delete()
    author = ctx.message.author
    embed = None
    ch = bot.get_channel(id=772349649553850368)

    mesge = await ctx.send("차단을 시킬까요?")
    await mesge.add_reaction('✅')
    await mesge.add_reaction('❌')
        
    def check1(reaction, user):
        return user == ctx.message.author and str(reaction.emoji) == "✅"

        try:
            reaction, user = await bot.wait_for("reaction_add", timeout = 30.0, check = check1)
            embed = discord.Embed(title="종합게임 커뮤니티 제재내역 - 차단", description=f'담당자 : {author.mention} n대상자 : {member.mention} n제재사유 : {reason} nn위와 같은 사유로 인해 제재처리 되었습니다.', color=0xff0000)
            embed.set_author(name=f"{str(member)}님을 서버에서 영구적으로 차단했어요.", icon_url=member.avatar_url_as(static_format='png', size=2048))
            embed.set_footer(text=f'처리 시각 - {str(now.year)}{str(now.month)}{str(now.day)} 일 | {str(now.hour)}{str(now.minute)}{str(now.second)}초 - 담당자 : {author.display_name}')
            await ch.send(embed=embed)
            await member.send(embed=embed)
            await ctx.guild.ban(member, reason=f'사유 : {reason}  -  담당자 : {author.display_name}')
    
        except asyncio.TimeoutError:
            print("Timeout")
    
    def check2(reaction, user):
        return user == ctx.message.author and str(reaction.emoji) == "❌"

        try:
            reaction, user = await bot.wait_for("reaction_add", timeout = 30.0, check = check2)
            await ctx.send("취소되었다")
        
        except asyncio.TimeoutError:
            print("Timeout")
 

В приведенном выше коде появляется следующая ошибка.

 reaction, user = await bot.wait_for("reaction_add", timeout = 30.0, check = check1)
                     ^
SyntaxError: 'await' outside async function
 

Если вы знаете, как это исправить, пожалуйста, помогите.

Я использовал переводчик.

Комментарии:

1. Вы пробовали менять def check1 на async def check1 и def check2 на async def check2 ? Я мало что сделал с async / await, но это то, что я бы попробовал в первую очередь, поскольку, похоже, именно это предлагает вам сообщение об ошибке.

2. Я думаю, что это идентификатор. Обратите внимание, что блок try находится внутри функции check1 … вы хотите выделить этот код, чтобы он был ban включен.

3. То же самое для check2 . вы помещаете следующую попытку внутри функции, когда она должна быть выделена на 4 пробела слева, чтобы она была частью родительской функции.

Ответ №1:

Python использует идентификацию для идентификации блоков кода. В вашем коде вы разместили await вызов внутри неасинхронной функции check1 . Вот пример той же проблемы:

 async def foo():

    def check1():
        return True
        
        baz = await bar() # improperly indented and in fact can never
                          # run because it is after the function `return`
 

Исправление заключается в перемещении кода за пределы check1 . Это должно соответствовать приведенному выше заявлению «def».

 async def foo():

    def check1():
        return True
        
    baz = await bar()
 

Ответ №2:

Ваша проблема связана с отступом после обеих проверок.

Я добавил # ---- here ---- , чтобы вы знали, где закончить check

 async def ban(ctx, member: discord.Member, *, reason: typing.Optional[str] = "사유 없음."):
    await ctx.message.delete()
    author = ctx.message.author
    embed = None
    ch = bot.get_channel(id=772349649553850368)

    mesge = await ctx.send("차단을 시킬까요?")
    await mesge.add_reaction('✅')
    await mesge.add_reaction('❌')
        
    def check1(reaction, user):
        return user == ctx.message.author and str(reaction.emoji) == "✅"
    
    # ---- here ----
    
    try:
        reaction, user = await bot.wait_for("reaction_add", timeout = 30.0, check = check1)
        embed = discord.Embed(title="종합게임 커뮤니티 제재내역 - 차단", description=f'담당자 : {author.mention} n대상자 : {member.mention} n제재사유 : {reason} nn위와 같은 사유로 인해 제재처리 되었습니다.', color=0xff0000)
        embed.set_author(name=f"{str(member)}님을 서버에서 영구적으로 차단했어요.", icon_url=member.avatar_url_as(static_format='png', size=2048))
        embed.set_footer(text=f'처리 시각 - {str(now.year)}{str(now.month)}{str(now.day)} 일 | {str(now.hour)}{str(now.minute)}{str(now.second)}초 - 담당자 : {author.display_name}')
        await ch.send(embed=embed)
        await member.send(embed=embed)
        await ctx.guild.ban(member, reason=f'사유 : {reason}  -  담당자 : {author.display_name}')

    except asyncio.TimeoutError:
        print("Timeout")
    
    def check2(reaction, user):
        return user == ctx.message.author and str(reaction.emoji) == "❌"
    # ---- here ----
    
    try:
        reaction, user = await bot.wait_for("reaction_add", timeout = 30.0, check = check2)
        await ctx.send("취소되었다")
    
    except asyncio.TimeoutError:
        print("Timeout")
 

Комментарии:

1. ни check1 того, ни check2 другого не должно быть async . Они являются простыми логическими проверками и не блокируют.

2. Я вижу это сейчас, я думал try , что это вне его,

3. Сначала меня это тоже зацепило. Озадачен тем, почему вы делаете try блок после возврата.