【问题标题】:UnboundLocalError: Referenced before assignment local variable 'emoji_count'UnboundLocalError:在分配局部变量“emoji_count”之前引用
【发布时间】:2018-10-03 06:59:14
【问题描述】:

您好,我在写作时遇到了一个 cog(机器人模块)的琐碎问题,我一直收到 UnboundLocalError: Referenced before assignment 我知道这是一个非常常见的问题,但我没有看到这个问题。

该模块可以正常工作,但每次对帖子做出反应时,都会在控制台中抛出此错误。

错误是:

starboard.py", line 22, in on_reaction_add if emoji_count > 0: #if 0 then 1 counts UnboundLocalError: local variable 'emoji_count' referenced before assignment

我正在查看的更具体的领域是:

async def on_reaction_add(self, reaction, user):

    for guild in self.bot.guilds:
        chan = get(guild.channels, name="starboard")
        if chan:
            if reaction.message.author == user:
                return
            if reaction.emoji == '⭐' or reaction.emoji == '????':
                if not chan:
                    return
                emoji_count = reaction.message.reactions[0].count
                msg = f"{reaction.message.author.mention} your post was posted to starboard." 
                em = discord.Embed(color=discord.Color(random.randint(0x000000, 0xFFFFFF)))
                display = f"""{reaction.message.content}"""
                em.description = display
                em.set_author(name=reaction.message.author.name, icon_url=reaction.message.author.avatar_url)
                em.set_footer(text=f"Posted in: #{chan.name}")
                em.timestamp = dt.datetime.utcnow()
            try:
                img_url = reaction.message.attachments[0].url
            except IndexError:
                img_url = None
            if not img_url:
                try:
                    img_url = reaction.message.embeds[0].url
                except IndexError:
                    img_url = None
            if img_url:
                em.set_image(url=str(img_url))
            if emoji_count > 0: #if 0 then 1 counts
                if not chan:
                    return
                await chan.send(msg)
                await chan.send(embed=em)

如果有人能告诉我这里发生了什么以及我哪里出错了,我将不胜感激。

【问题讨论】:

  • 如果反应不是星星之一,那么emoji_count 将没有那个if 的值。您也可以通过reaction.message.guild 获得公会的反馈。你不需要遍历所有你知道的公会。
  • 对不起,我有点困惑,你可以给我一个例子。
  • 如果我的代码中有if False: x = 1,然后我尝试print(x),你认为会发生什么?
  • 我将如何解决此错误或如何传递数字。 #if 0 then 1 counts 是添加到消息中的默认值。我认为 0 值意味着如果消息有 0 emoji_count(没有表情符号),那么 1 星反应将添加到消息右舷。我很抱歉我对 py 很陌生。

标签: python-3.x attributes discord discord.py discord.py-rewrite


【解决方案1】:

if reaction.emoji == '⭐' or reaction.emoji == '?': 中的 if 语句条件不返回 True 时,emoji_count 将不会被初始化
(emoji_count = reaction.message.reactions[0].count)
因此,当您尝试在 if emoji_count > 0: 下面的几行中使用它时,它会导致
local variable 'emoji_count' referenced before assignment,这正是它所说的,python 无法在运行的代码中的任何地方找到变量的初始化

【讨论】:

  • 我仍然无法理解我应该如何使用 if reaction.emoji == '⭐' or reaction.emoji == '?': 返回 True 我能想到的只是 return True 布尔值,但正如你所说,它只会引用 @987654329 @.
  • 你必须事先初始化emoji_count ,把它放在顶部就像emoji_count = 0
  • 修复了错误,但我遇到了另一个奇怪的错误。我将emoji_count = 0 放在顶部并更改了if emoji_count > 2:,如果使用除星号if reaction.emoji == '⭐' or reaction.emoji == '?': 之外的其他表情符号,它将无法运行。我假设是这条线emoji_count = reaction.message.reactions[0].count 导致了问题。
  • 与初始化emoji_count 的方式相同,您还必须在顶部某处初始化em = discord.Embed(color=discord.Color(random.randint(0x000000, 0xFFFFFF))),因为如果表情符号不是星号,它将不会被初始化,而这一行@ 987654338@ 不起作用(会抛出相同的错误)。我不确定您所说的“它不会运行”是什么意思,因为这似乎是您想要的(仅当用户输入其中一颗星时才运行)。您可以尝试将emoji_count = reaction.message.reactions[0].count更改为emoji_count = reaction.count
【解决方案2】:

我认为这里所说的内容如下:

  if emoji_count >= 2 : 
                if not chan:
                    return True

【讨论】:

  • 这也将尝试在分配值之前引用emoji_count
【解决方案3】:

正如前面的答案所说,应该是

if reaction.emoji == '⭐' or reaction.emoji == '?' is True:

【讨论】:

  • reaction.emoji == '?' is True 将被评估为reaction.emoji ==( '?' is True),这总是错误的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-10
  • 2020-01-16
  • 2019-12-05
  • 2017-09-19
  • 2020-09-26
  • 2022-01-02
相关资源
最近更新 更多