【问题标题】:discord.py-rewrite - How to use custom checks in cogs?discord.py-rewrite - 如何在 cogs 中使用自定义检查?
【发布时间】:2019-09-21 19:07:24
【问题描述】:

所以,在我的 bot.py 主文件中,我有:

class Bot(commands.Bot):

    # BOT ATTRIBUTES

    class default_cooldown:
        maxcommands = ...
        seconds = ...
        mode = ...

    class my_exception(commmands.CommandError): pass

    def my_check(self):
        def predicate(ctx):
            if ctx.author in a_list: return True
            raise self.my_exception

bot = Bot(...)

现在我还有一个 cog 文件,我想在其中使用 Bot().my_check() 检查和我的 Bot().default_cooldown() 类:

class Cog(commands.Cog):

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

    @commands.command()
    @self.bot.my_check()
    @commands.cooldown(self.bot.default_cooldown().maxcommands, self.bot.default_cooldown().seconds, self.bot.default_cooldown().mode)
    async def a_command(self, ctx):
        pass

但是我收到一个错误,说我的检查和冷却中没有定义self。谁能帮我解决这个问题?

【问题讨论】:

    标签: discord discord.py discord.py-rewrite


    【解决方案1】:

    方法在创建类对象时创建一次,而不是为每个实例单独创建。您有两种选择:

    1. 将需要出现在这两个地方的代码分解到仅包含该代码的第三个模块中,然后将其导入到其他两个文件中
    2. 将您的 Bot 定义移动到与您的机器人执行不同的模块中,并将 my_check 设置为 staticmethod。然后就可以通过Bot.my_check而不是通过具体实例来访问了。
    3. setup 中定义你的cog,以便类在创建bot 实例时知道它。

    【讨论】:

    • 是否可以在没有bot 的情况下写支票?最干净的方法是在文件中只包含def my_check...,没有类或根本不涉及bot
    • 如果可能的话,我也会将这两个文件移出您的主文件。您的其他文件都不应该依赖从主文件中导入的内容(您可能想阅读有关循环依赖的内容以了解原因)。通过传递bot 来隐式继承它们也不是一个很好的解决方案。最好将它们放在可以由主文件和扩展名导入的第三个位置。
    • 不一定。你到底在担心什么?
    猜你喜欢
    • 2019-04-30
    • 1970-01-01
    • 2020-09-04
    • 2021-04-29
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多