【发布时间】:2021-06-30 15:00:01
【问题描述】:
今天一个更不寻常的问题,但也许有人可以帮助我。
我正在开发一个与音乐有关的机器人。以下问题:
如果我在 cog 和 reload 中更改内容,我总是会收到特定命令的 AttributeError: 'NoneType' object has no attribute 'XXXX' 错误。 有没有办法解决/防止这种情况?
例如,当机器人在语音通道中时会发生错误,然后我重新加载 cog。
我向state查询每个与音乐有关的命令,可能与此有关吗?
state = self.get_state(ctx.guild)
get_state 的完整功能:
def get_state(self, guild):
"""Gets the state for `guild`, creating it if it does not exist."""
if guild.id in self.states:
return self.states[guild.id]
else:
self.states[guild.id] = GuildState()
return self.states[guild.id]
我尝试用 try/except AttributeError 解决它,但当然这并没有真正奏效/控制台仍然给了我输出。
这是一个示例代码:
@commands.command()
@commands.guild_only()
@commands.check(audio_playing)
@commands.check(in_voice_channel)
@commands.check(is_audio_requester)
async def loop(self, ctx):
"""Activates/Deactivates the loop for a song."""
state = self.get_state(ctx.guild)
status = state.now_playing.toggle_loop()
if status is None:
return await ctx.send(
embed=discord.Embed(title=":no_entry: Unable to toggle loop.", color=discord.Color.red()))
else:
return await ctx.send(embed=discord.Embed(
title=f":repeat: Loop: {'**Enabled**' if state.now_playing.loop else '**Disabled**'}.",
color=self.bot.get_embed_color(ctx.guild)))
如果我在 cog 中进行更改,重新加载它,然后再次尝试运行 loop,我会收到以下 错误:
In loop:
File "C:\Users\Dominik\PycharmProjects\AlchiReWrite\venv\lib\site-packages\discord\ext\commands\core.py", line 85, in wrapped
ret = await coro(*args, **kwargs)
File "C:\Users\Dominik\PycharmProjects\AlchiReWrite\cogs\music.py", line 220, in loop
status = state.now_playing.toggle_loop()
AttributeError: 'NoneType' object has no attribute 'toggle_loop'
(所有其他命令的错误相同)
请求,我们有 GuildState 类:
class GuildState:
"""Helper class managing per-guild state."""
def __init__(self):
self.volume = 1.0
self.playlist = []
self.message_queue = []
self.skip_votes = set()
self.now_playing = None
self.control_message = None
self.loop = False
self.skipped = False
def is_requester(self, user):
return self.now_playing.requested_by == user
我将如何克服这个错误?
机器人加入命令play URL,然后我构建了以下内容:
if not state.now_playing:
self._play_song(client, state, video)
_play_song主要定义如下:
def _play_song(self, client, state, song):
state.now_playing = song
# Other things are not relevant
【问题讨论】:
-
@ŁukaszKwieciński 当然,我会编辑我的问题。
-
能否也添加get_state方法?
-
@ŁukaszKwieciński 添加了方法
get_state -
你能补充一下
GuildState类是如何定义的吗? -
@Benjin Sure,也将其添加到帖子中
标签: python discord discord.py attributeerror