2010-12-10 1 views
1

Exemple:Quelles pourraient être les raisons pour lesquelles une classe n'est pas visible à moins d'être importée directement d'une fonction?

import user 

class Thing(object): 

    def doSomething(self): 

     u = user.User(1) 
     print u.name 

>> UnboundLocalError: local variable 'user' referenced before assignment 

Mais cela fonctionne:

class Thing(object): 

    def doSomething(self): 

     import user 
     u = user.User(1) 
     print u.name 

Merci pour votre aide!

Edit:

Mais cela fonctionne:

import user as anothername 

class Thing(object): 

    def doSomething(self): 

     u = anothername.User(1) 
     print u.name 
+0

duplication possible de [style de codage d'importation python] (http://stackoverflow.com/questions/477096/python-import-coding-style) –

Répondre

6

Le code que vous avez posté manque quelque chose, car il fonctionne très bien comme indiqué.

Je devine que votre code réel ressemble plus à ceci:

import user 

class Thing(object): 

    def doSomething(self): 
     u = user.User(1) 
     print u.name 
     # ... 
     user = something 

Le problème est que, en attribuant au nom local user vous avez dit que user est une variable locale pour le corps entier de cette fonction - même le code avant l'affectation. Cela signifie que le nom user fait et non fait référence à votre module dans cette fonction, il se réfère à une variable locale. Essayer de référencer une variable locale avant qu'une valeur lui soit affectée entraîne l'erreur que vous voyez.

L'utilisation d'une importation locale fonctionne car une partie de l'importation correspond à l'affectation. Par exemple: import user s'assure que le module "utilisateur" a été importé et affecte cet objet module au nom user. La solution simple est de changer le nom de votre variable locale en quelque chose qui ne fait pas d'ombre à votre importation.

+0

Eesh ok, j'essaie de comprendre les parties pertinentes à poster sans poster un million de classes/lignes. – ensnare

+0

J'essayais de comprendre comment cette exception spécifique pouvait être lancée à la place d'un 'NameError'. Essayez d'importer l'utilisateur en tant qu'utilisateur et modifiez toutes les références de la source qui échoue. Il pourrait être plus facile de trier de cette façon. –

+0

Vous avez lu mon code sans que je doive tout coller - merci beaucoup. J'apprécie beaucoup. Cela a fonctionné! – ensnare

Questions connexes