2010-11-26 2 views
0

Je suis en train de créer un simple paquet multi-niveaux:NameError dans la définition de python package multi-niveaux

test_levels.py 
level1/ 
     __init__.py (empty file) 
     level2/ 
       __init__.py (only contents: __all__ = ["leaf"]) 
       leaf.py 

leaf.py:

class Leaf(object): 
    print("read Leaf class") 
    pass 

if __name__ == "__main__": 
    x = Leaf() 
    print("done") 

test_levels.py:

from level1.level2 import * 
x = Leaf() 

L'exécution de leaf.py fonctionne correctement, mais l'exécution de test_levels.py renvoie la sortie ci-dessous, où j'étais exp ect aucune sortie:

read Leaf class 
Traceback (most recent call last): 
    File "C:\Dev\intranet\test_levels.py", line 2, in <module> 
    x = Leaf() 
NameError: name 'Leaf' is not defined 

Est-ce que quelqu'un peut signaler ce que je fais mal?

Répondre

0

essayez d'ajouter

from leaf import * 

dans le fichier niveau1/niveau 2/__ init__.py

màj: comme dans un commentaire précédent, ajoutez point avant le nom du module, et de supprimer la déclaration "de __all__".

$ cat level1/level2/__init__.py 
from .leaf import Leaf 
$ cat level1/level2/leaf.py 
class Leaf: 
    def __init__(self): 
     print("hello") 
$ cat test.py 
from level1.level2 import * 
x = Leaf() 
$ python test.py 
hello 
+0

Je pense que 'de .leaf' ne fonctionnera que dans Python 3 (ou si vous importez des importations absolues de '__future__' dans Python 2). –

+0

Oui, mais je pense que topicstarter utilise exactement python3, parce qu'il a écrit print (...) au lieu d'imprimer ... – werehuman

+0

J'utilise 2.6, mais "from .leaf" semble fonctionner. – RuiDC

0

En level1/level2/__init__.py, je pense que vous voulez faire from leaf import * (ou, dans Py3K, from .leaf import *).

Lorsque vous importez à partir de level1.level2, vous importez réellement le fichier __init__.py dans ce répertoire. Puisque vous n'avez pas défini Leaf, vous ne l'obtenez pas en l'important.

+0

J'utilise Python 2.6, et l'ajout de leaf import * à level1/level2/__ init__.py fonctionne, mais étant donné que son contenu est déjà: __all__ = ["leaf"] et que "read Leaf class" est dans le sortie, ne devrait-il pas déjà fonctionner? ou le __all__ ne peut-il pas être utilisé dans ce contexte? – RuiDC

+0

'__all__' définit la liste des noms qui seront utilisés par' from import * ', mais ces noms doivent encore être définis dans ce contexte. Dans votre structure, la classe Leaf est dans 'level1.level2.leaf'. Ainsi, dans test_levels.py, vous pouvez appeler 'leaf.Leaf()'. Ou vous pouvez faire 'depuis level1.level2.leaf import *'. –

0

Souhaitez-vous importer tous les noms de variables de tous les modules de ce paquet? C'est une idée horrible. Pour faire ce que vous voulez, il devrait être

from level1.level2.leaf import * 

ou encore mieux encore pour éliminer l'importation générique, ce qui est généralement mauvais, il devrait être

from level1.level2.leaf import Leaf 
Questions connexes