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!")
我在创建简单的 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!")