【问题标题】:Discord bot extensions with same Object具有相同对象的不和谐机器人扩展
【发布时间】:2018-10-15 20:23:09
【问题描述】:

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

我可以在我的 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))

【问题讨论】:

    标签: python python-3.x discord.py discord.py-rewrite


    【解决方案1】:

    如果你的 cog 都依赖于这个共享对象,那么你应该问问自己,它们的功能是否真的足够独立,可以分成不同的模块。

    也就是说,如果您编写自己的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)
    

    【讨论】:

    • 我无法让它工作:lib.setup(bot, sharedobj) TypeError: setup() 需要 1 个位置参数,但给出了 2 个
    • @Mindau 我的错。确保使用本地的load_extension 而不是client.load_extension。您还需要确保所有 setup 函数都采用 2 个参数
    猜你喜欢
    • 2019-09-13
    • 2018-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2021-11-18
    • 2020-07-03
    • 2020-09-23
    相关资源
    最近更新 更多