[PYTHON] Nest Zahnrad in discord.py

Annahme

Der Code in diesem Artikel ist nur ein vereinfachter Code zur Erklärung, sodass nur Unsinncode angezeigt wird. Bitte beachten Sie.

Zahnrad ist kompliziert geworden

Die Befehlserweiterung discord.py (https://discordpy.readthedocs.io/ja/latest/ext/commands/index.html) bietet die Möglichkeit, mehrere Befehle und Ereignisse zu gruppieren, die als cog bezeichnet werden. auf diese Weise

hoge.py


from discord.ext import commands as c

class CogHogeFuga(c.Cog):
    def __init__(self, bot, hoge):
        self._bot = bot
        self._hoge = hoge

    @c.command()
    async def hoge1(self, ctx):
        await ctx.send("hoge")
    
    @c.command()
    async def hoge2(self, ctx):
        foo = await hoge3()
        return foo

    async def hoge3(self):
        return self._hoge

Wenn Sie schreiben, werden durch einfaches Laden von "CogHogeFuga" sowohl "hoge1" als auch "hoge2" geladen.

Mit fortschreitender Entwicklung wurde es jedoch wie folgt.

hoge.py


from discord.ext import commands as c

class CogHogeFuga(c.Cog):
    def __init__(self, bot, hoge):
        self._bot = bot
        self._hoge = hoge
        self._fuga = None

    @c.command()
    async def hoge1(self, ctx):
        await ctx.send("hoge")
    
    @c.command()
    async def hoge2(self, ctx):
        foo = await hoge3()
        await ctx.send(foo)

    async def hoge3(self):
        return self._hoge

    """
Von hier unten hinzugefügte Befehle
    """
    
    @c.command()
    async def fuga1(self, ctx):
        return ctx.send("fuga")

    async def fuga2(self, ctx, new_):
        self._fuga = new_

    @c.command()
    async def fuga3(self, ctx):
        foo = await fuga4()
        await ctx.send(foo)

    async def fuga4(self):
        return self._fuga

Ich habe versucht, es irgendwie hinzuzufügen, aber die Befehle für "hoge" und die Befehle für "fuga" sind gemischt. Vielleicht wird es in Zukunft mehr Befehle geben, die sich auf "bar" beziehen, und ich möchte sie, wenn möglich, trennen.

Durch einfaches Erhöhen der Anzahl der Zahnräder wird jedoch der Zeit- und Arbeitsaufwand für das Laden der Zahnräder erhöht. Sowohl "hoge" als auch "fuga" sind ähnlich. Wenn möglich, möchte ich dies mit nur einem Versuch von "bot.add_cog (CogHogeFuga (bot))" tun.

Nest Zahn

Ich denke, es wäre schön, Zahnräder nisten zu können. Wenn Sie Folgendes schreiben, kann das Laden des Zahnrads selbst als "bot.add_cog (CogHogeFuga (bot))" belassen werden.

hoge.py


from discord.ext import commands as c

class CogHogeFuga(c.Cog):
    def __init__(self, bot, hoge):
        self._bot = bot

        self._bot.add_cog(CogHoge(self._bot, hoge)) #Punkt
        self._bot.add_cog(CogFuga(self._bot)) #Punkt

class CogHoge(c.Cog):
    def __init__(self, bot, hoge):
        self._bot = bot
        self._hoge = hoge


    @c.command()
    async def hoge1(self, ctx):
        await ctx.send("hoge")
    
    @c.command()
    async def hoge2(self, ctx):
        foo = await hoge3()
        await ctx.send(foo)

    async def hoge3(self):
        return self._hoge
    

class CogFuga(c.Cog):
    def __init__(self, bot):
        self._bot = bot
        self._fuga = None

    @c.command()
    async def fuga1(self, ctx):
        return ctx.send("fuga")

    async def fuga2(self, ctx, new_):
        self._fuga = new_

    @c.command()
    async def fuga3(self, ctx):
        foo = await fuga4()
        await ctx.send(foo)

    async def fuga4(self):
        return self._fuga

Durch Übergeben des Bots selbst beim Hinzufügen von Cog wie oben beschrieben war es möglich, zum Zeitpunkt der Initialisierung weitere Cogs zum Bot hinzuzufügen.

Am Ende

Bitte lassen Sie mich wissen, ob es einen einfacheren Weg gibt.

Was ist dankbar

Es ist die Rückseite des Kühlers. Wie oben erwähnt, muss jedes Zahnrad dem Bot add_cog sein. Es gibt auch eine Funktion zum Laden der gesamten Datei namens "Extension", die jedoch auch die "setup ()" - Methode in der Datei ausführt, sodass Sie hier "add_cog" schreiben müssen.

ich kann

――Ich möchte die Dinge zusammenschreiben, die sehr relevant sind, ich möchte verstehen ――Ich möchte vermeiden, mehrere Stellen mit einer Reparatur zu bearbeiten

So wird es durch Verschachteln von Cog realisiert. Wenn Sie mit dieser Schreibmethode beispielsweise ein bestimmtes Zahnrad teilen möchten, müssen Sie nur das Zahnrad neu schreiben, das Sie teilen möchten, und es ist nicht erforderlich, den Vorgang des Ladens eines neuen Zahnrads in einem anderen Teil zu beschreiben.

Recommended Posts

Nest Zahnrad in discord.py
Verstehen Sie Zahnräder und Erweiterungen in discord.py
[Discord.py] Cog verstehen
Verschachteln Sie Module in Boost.Python
Aktualisierte Nachrichten in discord.py
Übergeben Sie Argumente in discord.py an Task