O que realmente é @client.evento? discord.py

Há alguns dias, interessei-me por programar um pouco os Robots da discórdia. Na sintaxe destes programas notei um monte de questões ininteligíveis para as quais não consigo encontrar uma resposta. É por isso que te estou a pedir ajuda para compreendê-los.

todas as perguntas são baseadas neste código:

import discord
import asyncio
from discord.ext import commands

botToken = '***'

client = commands.Bot(command_prefix = '.')

@client.event
async def on_ready():
    print('Bot is ready!')

@client.event
async def on_message(message):
    author = message.author
    if message.content =='Hello':
        await client.send_message(message.channel, 'Welcome again {}!'.format(author))


client.run(botToken)

O que é @client.evento? Descobri que é um manipulador de eventos, mas como é que funciona? Por que é necessário executar o programa? Está de alguma forma ligado a um asyncio?

Author: ArtFiNCH, 2018-10-07

1 answers

Quando Client recebe um evento de Discórdia, que trabalha para fora o que esse evento e gera, ou localiza, os objetos que foram enviados pelo evento, tais como discord.Message para qualquer MESSAGE_RECEIVE eventos, ou um discord.Reaction para REACTION_ADD etc.
O cliente então envia os objetos para o método que lida com esses eventos, mas você primeiro precisa dizer ao cliente quais são esses métodos. É aqui que entram os decoradores de eventos.


Os decoradores são, em essência, funções que requerem outras funções como argumentos. O mais comum que você vai ver é @property. Isto diz que a função que você define deve ser passada para a função property()
@property
def name(self):
    return self._name

É o mesmo que

def name(self):
    return self._name

name = property(name)
Isto pode ser um pouco confuso, mas é assim ... discord.py trata dos seus eventos.

Quando usas o decorador no teu on_message, o que estás a fazer é dizer on_message = client.event(on_message)

O código interno de discord.py para on_event is isto

def event(self, coro):
    # Validation we don't need to worry about
    setattr(self, coro.__name__, coro)
    return coro

O que significa que toma a função como seu parâmetro, e define um novo atributo no próprio cliente. Para o nosso exemplo on_message, passamos a nossa função on_message para client.event() e faz com que o cliente defina um novo método client.on_message que é o mesmo método que o nosso on_message.

Nota: func.__name__ devolve o nome dessa função. on_message.__name__ vai voltar "on_message".
setattr(obj, name, value) define um atributo num objecto, por isso setattr(self, "foo", 100) significa que self.foo será 100.

Agora que o o cliente conhece o nosso on_message, quando recebe um evento que diz que uma mensagem foi enviada, cria o objeto discord.Message e passa para client.on_message, que como já estabelecemos, é o mesmo que o nosso próprio on_message

Se quisesses, podias até saltar o decorador e fazer isto depois da tua função, mas é menos elegante do que um decorador é:

on_message = client.event(on_message)
 16
Author: Sam Rockett, 2018-10-07 15:54:55