所以我正在为Discord制作一个Python机器人,我收到一个奇怪的错误(之后我还有另一个询问):
TypeError: decorator() missing 1 required positional argument: 'func'
我不确定是什么原因造成的。我为项目设置文件树的方式如下:
├───.idea
├───handlers
│ └───userHandler.py
└───src
└───main.py
它指向第23行到我on_message
main.py
方法中的@client.event
async def on_message(message):
if message.content.startswith(client.command_prefix + 'tstring'):
client.send_message(message.channel, 'Hello, ' + str(userHandler.getuser()))
方法(整个方法):
client.send_message(message.channel, 'Hello, ' + str(userHandler.getuser()))
第23行就是这个:
userHandler
userHandler.py
方法位于@client.command
async def getuser(user, member: discord.Member = None):
if member is None:
member = user.message.author
client.say('{0}'.format(member))
,如上图所示:
@client.command
用户处理程序文件与main分开,因为我想在自己的系统中处理所有基于用户的命令。我将在它自己的处理程序中对命令使用相同的逻辑。
所以我有两个问题:
是否可以/理想地将命令写在远离main.py的不同文件中并仍然在main中调用它们来使用?如果是这样,每当我在main.py
commandHandler.py
中调用命令时,即使它已经在commandHandler.py
文件中,我是否需要编写packages
?或者有更优化的方法吗? (不确定这是否足够意义)
我刚刚在上面的错误中错过了一个参数吗?我目前还没有很好地使用Discord.py API。如果没有,问题是什么?我真的希望我该死的。
答案 0 :(得分:1)
要回答您的第一个问题,是的,您可以在单独的文件中编写命令,并让它们仍然注册到main。在discord.py中,这是使用cogs调用的。这是example。
您的代码存在一些问题,假设您拥有它的确切方式。首先,您必须始终await
coroutine函数才能使用它们 - > await client.send_message("Hello")
... await client.say("Hello")
其次,我并不完全确定创建一个" userhandler"是个好主意。特别是您尝试考虑的方式,可以更直接地获取用户对象。
最后,请参阅我上面发布的链接,了解如何使用@client.command()
装饰器。