Python变量存在未定义?

Python variable exists undefined?

我在创建简单的 on/off 开关时遇到问题。 我是初学者,正在编写一个不和谐的机器人来娱乐和学习。我的机器人在不止一台服务器上,这就是全局变量不是一个选项的原因(运行在一台服务器上设置它也会为其他服务器更改它)。 将变量放在命令中不是一个选项,因为每次我 运行 命令时,它都会定义它。 我需要一些存在但只能由子流程定义的东西。

@bot.command()
async def xxx(ctx):

    # global x # doesn't work correctly
    # x = "" # doesn't work correctly

    if x != True:
        x = True
        await ctx.send("X is on!")
 
    else:
        x = False
        await ctx.send("X is off!")


    while x == True:
        #some code calculations here, blablabla

    await asyncio.sleep(60)

我的问题有什么解决方案? 谢谢。

您必须将开关设置在起始位置。你如何做到这一点取决于你。我会亲自创建一个开关 class。简单的解决方案是在函数外部全局设置起始位置。示例:

global x
x = 0
@bot.command()
async def x(ctx):

    if x != True:
        x = True
        await ctx.send("X is on!")
 
    else:
        x = False
        await ctx.send("X is off!")

    while x == True:
        #some code calculations here, blablabla

    await asyncio.sleep(60)

您可以尝试将此代码包装在一个对象中并将 X 声明为 class 变量 IE

class ChatBot(object):
    x = False

    @classmethod
    @bot.command()
    def xxx(ctx):
        if x != True:
            x = True
            await ctx.send("X is on!")

        else:
            x = False
            await ctx.send("X is off!")


        while x == True:
            #some code calculations here, blablabla

        await asyncio.sleep(60)

面向对象编程使 python 中的许多事情更容易实现和调试,另外还有不用担心全局变量的好处(通常最好避免使用单例,除非您绝对需要它们 - IE 日志记录或配置)。祝你好运 - 命名变量和函数也很重要 运行 所以我建议你早点养成习惯!

我假设 server 表示 ctx.guild - 因此您可以使用字典来保存不同服务器的值 - x[ctx.guild.name]x[ctx.guild].

您不必在开始时创建所有服务器,但如果服务器在字典中并添加默认值,您可以签入功能。

# global dictionary
x = dict()

@bot.command()
async def xxx(ctx):
    # dictionary doesn't need `global x` in function

    server_name = ctx.guild.name
    
    # set default value if used first time on server/guild
    if server_name not in x:
        x[server_name] = False
        
    if not x[server_name]:
        x[server_name] = True
        await ctx.send("X is on!")
    else:
        x[server_name] = False
        await ctx.send("X is off!")

    while x[server_name]:
        #some code calculations here, blablabla

    await asyncio.sleep(60)

您也可以使用 not

切换 True/False
x[server_name] = not x[server_name]

if x[server_name]:
    await ctx.send("X is on!")
else:
    await ctx.send("X is off!")