#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
блок после возврата.