2017-09-17 1 views
2

je suis tombé sur le problème suivant:'second_file' n'a pas d'attribut 'bonjour' - Discorde Python Bot

First_File:

import discord 
import second_file 
client = discord.Client() 
[...] 
@client.event 
async def on_message(message): 
    if message.content.lower().startswith("!hi"): 
     await second_file.hello() 

Second_File:

from first_file import client 
from first_file import on_message 
async def hello(client, on_message): 
    await client.send_message(message.channel, "Hiii <3!") 

Et maintenant, je reçois le message d'erreur: module 'second_file' has no attribute 'hello'. Pourquoi n'appelle-t-il pas la fonction?

Répondre

1

Il s'agit d'un message d'erreur assez énigmatique par rapport à ce qui se passe réellement. Vous essayez d'importer à partir des deux fichiers en même temps et cela provoque des problèmes. Chaque fois que vous importez, le fichier complet sera interprété, même si vous utilisez from file import thing. Pour être plus précis dans votre cas, await second_file.hello() échoue car second_file n'a pas encore été entièrement importé lorsque vous y êtes arrivé.

Voici ce qui est en cours d'exécution et pourquoi il échoue (vous pouvez le vérifier à partir de la trace de la pile que vous obtenez lorsque vous essayez d'importer le fichier dans un REPL python3):

  1. import second_file dans first_file, arrête l'interprétation des first_file et déclenche une interprétation complète de second_file.
  2. from first_file import client arrête l'interprétation de second_file et déclenche une interprétation complète de first_file.
  3. Cette fois, import second_file est ignorée (sinon, vous obtiendrez une boucle infinie). Continuez à interpréter first_file jusqu'à ce que ...
  4. await second_file.hello(): en ignorant l'erreur de syntaxe où hello() accepte deux arguments, notez que l'interpréteur ne connaît pas encore hello(). Évidemment, c'est une erreur de syntaxe puisque vous utilisez quelque chose que vous n'avez pas encore défini!

Pour résoudre ce problème, utilisez l'architecture que vous avez déjà créée. Il suffit de supprimer les deux instructions d'importation au début de second_file. J'ai également pris la liberté d'ajouter l'argument message il semble que vous avez oublié. Je ne sais pas pourquoi vous avez même besoin de la fonction on_message, mais pour être honnête, je ne connais pas votre cas d'utilisation.

first_file

import discord 
import second_file 
client = discord.Client() 
[...] 
@client.event 
async def on_message(message): 
    if message.content.lower().startswith("!hi"): 
     await second_file.hello(client, on_message, message) 

second_file

async def hello(client, on_message, message): 
    await client.send_message(message.channel, "Hiii <3!") 
+0

'de Client' d'importation first_file ne pas "arrêter l'interprétation de second_file": existe déjà dans' 'first_file' sys.modules', il essaie donc pour l'utiliser. La question devrait être "Pourquoi ne pas obtenir' ImportError: ne peut pas importer le nom 'client'' de cette ligne? " –

+0

Peut-être que je suis arrivé à la bonne réponse pour la mauvaise raison. Il a semblé dans mes essais que la cause première était l'importation (comme le correctif que j'ai décrit dans ma réponse qui enlève seulement l'importation cyclique fonctionne). Essayez-le vous-même avec un MVCE (ne devrait pas être difficile à faire un), vous obtenez des erreurs dans l'interprétation du fichier au lieu d'un 'ImportError'. –

+0

Merci beaucoup @PeterG !! Cela a résolu le problème! Et vous aviez raison, je n'avais pas besoin de la fonction "on_message": p! Merci beaucoup!! – itzFlubby