首页 > 解决方案 > python / discord.py中的全局变量

问题描述

所以我在代码的开头声明了 3 个变量

setup_prefix = None
setup_role: Role = None
setup_channel: TextChannel = None

然后随着on_message事件的发生,我试图打电话给他们并改变他们的价值观

async def on_message(message):
    if servers_setup[message.guild.id]['Step1']:
        global setup_prefix
        setup_prefix = message.content
        servers_setup[message.guild.id]['Step1'] = False
        await message.channel.send("Now, mention the role you want to have admin rights")
        servers_setup[message.guild.id]['Step2'] = True
    if servers_setup[message.guild.id]['Step2']:
        global setup_role
        setup_role: Role = message.content
        servers_setup[message.guild.id]['Step2'] = False
        await message.channel.send("Now, mention the channel where do you want the logs to go into")
        servers_setup[message.guild.id]['Step3'] = True
    if servers_setup[message.guild.id]['Step3']:
        global setup_channel
        setup_channel: TextChannel = message.content
        servers_setup[message.guild.id]['Step3'] = False
        await message.channel.send("Great, now I can take care of the rest!")
        changeprefix(message, setup_prefix)
        changeadmin(message, setup_role)
        changelogs(message, setup_channel)
        await message.channel.send("Everything was configured. Have a nice day")

第一个(setup_prefix)没有任何问题,但是第二个在我启动机器人时会在控制台中引发错误

SyntaxError: annotated name 'role_setup' can't be global

我不知道问题出在哪里...

标签: pythonpython-3.xdiscord.py

解决方案


问题可以简化为

def foo():
    global bar
    bar:int = 1

运行时你得到

  File "test.py", line 3
    bar:int = 1
    ^
SyntaxError: annotated name 'bar' can't be global

来自 PEP 526 - 变量注释的语法,当不允许注释时

试图在同一个函数范围内注释全局或非局部变量是非法的……原因是全局和非局部不拥有变量;因此,类型注释属于拥有变量的范围。

您在脚本顶部的变量范围内进行了注释。无需在函数中再次尝试。只需将那段代码更改为

if servers_setup[message.guild.id]['Step2']:
    global setup_role
    setup_role = message.content

推荐阅读