输入字符串,输出对象等于字符串

时间:2019-03-23 15:53:23

标签: python

我正在使用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台服务器,并且想添加更多服务器。谢谢!

2 个答案:

答案 0 :(得分:0)

当对象的数量为变量时(无论它们是字符串,整数还是用户定义的类),请考虑使用listdict,{ {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")