web-dev-qa-db-fra.com

NameError: le nom global 'myExample2' n'est pas défini # modules

Voici mon fichier example.py:

from myimport import *
def main():
    myimport2 = myimport(10)
    myimport2.myExample() 

if __== "__main__":
    main()

Et voici le fichier myimport.py:

class myClass:
    def __init__(self, number):
        self.number = number
    def myExample(self):
        result = myExample2(self.number) - self.number
        print(result)
    def myExample2(num):
        return num*num

Lorsque j'exécute le fichier example.py, le message d'erreur suivant s'affiche:

NameError: global name 'myExample2' is not defined

Comment puis-je résoudre ce problème?

6
Michael

Voici une solution simple à votre code.

from myimport import myClass #import the class you needed

def main():
    myClassInstance = myClass(10) #Create an instance of that class
    myClassInstance.myExample() 

if __== "__main__":
    main()

Et le myimport.py:

class myClass:
    def __init__(self, number):
        self.number = number
    def myExample(self):
        result = self.myExample2(self.number) - self.number
        print(result)
    def myExample2(self, num): #the instance object is always needed 
        #as the first argument in a class method
        return num*num
8
aIKid

Je vois deux erreurs dans votre code:

  1. Vous devez appeler myExample2 en tant que self.myExample2(...)
  2. Vous devez ajouter self lors de la définition de myExample2: def myExample2(self, num): ...
8
shx2

Vous devez créer une instance de la classe myClass, et non l'instance de l'ensemble du module (et j'édite les noms de variables pour qu'ils soient moins terribles):

from myimport import *
def main():
    #myobj = myimport.myClass(10)
    # the next string is similar to above, you can do both ways
    myobj = myClass(10)
    myobj.myExample() 

if __== "__main__":
    main()
0
Feanor

Tout d'abord, je suis d'accord avec la réponse de alKid. C'est vraiment plus un commentaire sur la question qu'une réponse, mais je n'ai pas la réputation de commenter.

Mon commentaire:

Le nom global à l'origine de l'erreur est myImport et non myExample2

Explication:

Le message d'erreur complet généré par mon Python 2.7 est:

Message File Name   Line    Position    
Traceback               
    <module>    C:\xxx\example.py   7       
    main    C:\xxx\example.py   3       
NameError: global name 'myimport' is not defined

J'ai trouvé cette question lorsque j'essayais de retrouver une obscure erreur "nom global non défini" dans mon propre code. Parce que le message d'erreur dans la question est incorrect, j'ai fini par être plus confus. Lorsque j'ai exécuté le code et constaté l'erreur réelle, tout était logique.

J'espère que cela empêchera quiconque de trouver ce fil d'avoir le même problème que moi. Si quelqu'un qui a plus de réputation que moi veut en faire un commentaire ou résoudre la question, n'hésitez pas.

0
Dennis

Alors que les autres réponses sont correctes, je me demande s’il est vraiment nécessaire que myExample2() soit une méthode. Vous pouvez aussi bien le mettre en œuvre de manière autonome:

def myExample2(num):
    return num*num

class myClass:
    def __init__(self, number):
        self.number = number
    def myExample(self):
        result = myExample2(self.number) - self.number
        print(result)

Ou, si vous voulez garder votre espace de noms propre, implémentez-le en tant que méthode, mais comme il n'a pas besoin de self, en tant que @staticmethod:

def myExample2(num):
    return num*num

class myClass:
    def __init__(self, number):
        self.number = number
    def myExample(self):
        result = self.myExample2(self.number) - self.number
        print(result)
    @staticmethod
    def myExample2(num):
        return num*num
0
glglgl