我正在使用Discord机器人在我的服务器上运行某些程序。目前,我已经对其进行了设置,以便如果我说“ Bot,启动XGamingServer”,它将使用字符串,将其拼接以获得第三个单词“ XGamingServer”,然后针对每个服务器通过单独的'if'语句运行它已存储。我想知道是否有更好的方法来组织它,以便它将查看我拥有的服务器的所有实例,并且如果“ XGamingServer”与任何对象self.name匹配,它将返回该对象。
我已经尝试过if,elif语句的大树,这非常庞大,但是确实可以完成工作。我也尝试过列出所有世界的清单,并尝试以这种方式进行比较,但是发现了错误,而且我走得还很远。
class World:
def __init__(self, name, runfile):
self.name = name
self.runfile = runfile
def Run(self):
## The code that runs the server
pass
MainWorld = World("MainWorld","Examplefile1")
SpinOffWorld = World("SpinOffWorld", "DifferentStartFile")
# Actual Discord Bot code, problem not unique to the discord bot
async def on_message(msg):
if msg.content.startswith("Bot, start"):
findProgram = msg.content.split(" ")
ServerKind = findProgram[2]
if ServerKind = "MainWorld":
MainWorld.Run()
## Other code
elif ServerKind = "SpinOffWorld":
SpinfOffWorld.Run()
## OtherCode
elif ServerKind = "AnyOtherServer":
AnyOtherServer.Run()
## OtherCode
else:
await client.say(msg.channel, "Sorry, Server Not Recognised")
就像我说的那样,这段代码可以正常工作,并且一切都可以正常运行,但是每个if语句中都有3行,并且除了要运行的世界之外,它们都是相同的。确实增加了代码的大小,因为我现在有大约6台服务器,并且想添加更多服务器。谢谢!
答案 0 :(得分:0)
当对象的数量为变量时(无论它们是字符串,整数还是用户定义的类),请考虑使用list
,dict
,{ {1}} ...所有这些漂亮的小容器。 tuple
在这里似乎很合适:
dict
答案 1 :(得分:0)
假定所有服务器类都有一个公共基类Server
:
server = globals().get(ServerKind)
if isinstance(server, Server):
server.Run()
# ...
else:
await client.say(msg.channel, "Sorry, Server Not Recognised")