我需要在多个扩展名(齿轮)中使用同一对象。如何编辑我的简单机器人示例来实现这一目标?

我可以在main.py或cog文件中启动SHARED_OBJECT。要点是在COG1和COG2扩展中使用相同的对象。重要的是要考虑到每个扩展名都可以在程序启动后重新加载。

我正在使用discord.py rewrite lib

main.py

client = Bot(description="Bot", command_prefix="!")
client.run(__token__)
SHARED_OBJECT = SomeObject()


@client.event
async def on_ready():
    client.dev = True
    print('[Discord] Logged in as {} (ID:{}) | Connected to {}  servers'.format(client.user.name,client.user.id,1))

    client.load_extension('COG1')
    client.load_extension('COG2')


COG1.PY类

class COG1():
    def __init__(self, bot):
        self.bot = bot

    @commands.command()
    async def test(self):
    print()

def setup(bot):
    bot.add_cog(COG1(bot))


COG1.PY类

class COG2():
    def __init__(self, bot):
        self.bot = bot

    @commands.command()
    async def test(self):
    print("test")

def setup(bot):
    bot.add_cog(COG2(bot))

最佳答案

如果您的齿轮都依赖于此共享对象,那么您应该问问自己,它们的功能是否真的足够独立,可以分为不同的模块。

就是说,如果您编写自己的load_extension,则可以编写采用此共享库并将其传递给类setup__init__方法。我将actual implementation标记为下面的内容,为简洁起见删除了一些验证。

cog1.py :(与cog2相同)

class COG1():
    def __init__(self, bot, sharedobj):
        self.bot = bot
        self.sharedobj = sharedobj

    @commands.command()
    async def test(self):
        print()

def setup(bot, sharedobj):
    bot.add_cog(COG1(bot, sharedobj))


main.py

import importlib

def load_extension(name, bot, sharedobj):
    if name in self.extensions:
        return
    lib = importlib.import_module(name)
    lib.setup(bot, sharedobj)
    bot.extensions[name] = lib

SHARED_OBJECT = SomeObject()

load_extension('COG1', SHARED_OBJECT)
load_extension('COG2', SHARED_OBJECT)

10-07 19:07
查看更多