如何在discord.py命令函数中使用计数器?

时间:2018-03-31 05:59:58

标签: python-3.6 discord discord.py

如何在命令功能中获得增加的计数器?例如:

global counter
counter = 0
@client.command(pass_context=True)
   async def pick(ctx):
   counter += 1

每次我尝试这样做时,它都会给我这个错误: UnboundLocalError:分配前引用的局部变量'counter' 我已经尝试了很多方法来实现这个目标,但我无法想象它能挽救我的生命以及我所爱的人。

3 个答案:

答案 0 :(得分:1)

有几种方法可以实现你想要的东西。

正如你在hopethatsacleanwet的回答中所提到的那样,你只需要全局变量名,这样你就可以访问全局范围而不是本地范围。

@client.command()
async def pick():
    global counter
    counter += 1

正如benjin的回答所提到的,你也可以使用cog将变量绑定到函数可以访问的范围。

class MyCog:
    def __init__(self, bot):
        self.bot = bot
        self.counter = 0

    @commands.command()
    async def pick(self):
        self.counter += 1

def setup(bot):
    bot.add_cog(MyCog(bot))

你甚至可以将计数器绑定到机器人

client.counter = 0
@client.command()
async def pick():
    bot.counter += 1

我建议你阅读python's namespaces

答案 1 :(得分:0)

您可以尝试使用self.counter创建一个cog。您可以通过创建一个包含Class的单​​独文件,在底部创建一个setup函数,然后在运行bot的主代码中使用load_extension来完成此操作。下面的示例代码。

<强> bot.py

from discord.ext import commands

client = commands.Bot(command_prefix='!')

client.load_extension('cog')

client.run('TOKEN')

<强> cog.py

from discord.ext import commands

class TestCog:

    def __init__(self, bot):
        self.bot = bot
        self.counter = 0

    @commands.command()
    async def pick(self):
        self.counter += 1
        await self.bot.say('Counter is now %d' % self.counter)


def setup(bot):
    bot.add_cog(TestCog(bot))

答案 2 :(得分:0)

发生错误的原因是因为Python试图在counter命令中的本地范围内定义pick。为了访问全局变量,您需要在本地上下文中将其“重新定义”为全局变量。将pick命令更改为此将修复它:

@client.command(pass_context=True)
async def pick(ctx):
    global counter
    counter += 1