(Python3)将对象传递给导入的模块函数

时间:2018-08-02 16:53:12

标签: python object module discord.py

我要将我创建的模块导入到计划作为main运行的python文件中。

在模块中,我有一个函数,

def coms(message, instRole):

其中instRole应该是类的实例


在我的主要python文件中,我有一个对象,

instRole = Role()

我有一个功能:

def on_message(message):
    coms(message, instRole)

我在下一行中调用:

on_message(m)

但是,永远不会调用coms函数。我已经在coms中放入了print语句,以确保它被调用,而不是被调用。

谢谢您的帮助

1 个答案:

答案 0 :(得分:0)

如果您试图利用事件的优势,当机器人看到消息时将执行代码,那么您要定义一个协程(一个函数(使用async def语法)并使用bot.event装饰器将其注册到您的机器人。下面是一个基本示例:

from discord.utils import get
from discord.ext import commands
from other_file import coms

bot = commands.Bot(command_prefix='!')

@bot.event
async def on_message(message):
    instRole = get(message.server.roles, id="123")  # Get the role with its id
    await coms(message, instRole)

bot.run("TOKEN")

如果您希望其他文件中的协程实际上在不和谐的情况下,则最好使该文件成为齿轮,这是一个为不和谐机器人实现特定功能的类。

cog.py:

from discord.ext import commands

class Cog():
    def __init__(self, bot):
        self.bot = bot
    # Note no decorator
    async def on_message(self, message):
        await self.coms(message, instRole)
    async def coms(self, message, role):
        ...  # use self.bot instead of bot

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

main.py:

from discord.ext import commands 

bot = commands.Bot(command_prefix='!')

cogs = ['cog']

if __name__ == "__main__":
    for cog in cogs:
        try:
            bot.load_extension(cog)
        except Exception:
            print('Failed to load cog {}\n{}'.format(extension, exc))

    bot.run('token')