NameError в определении многоуровневого пакета python - PullRequest
0 голосов
/ 26 ноября 2010

Я пытаюсь создать простой многоуровневый пакет:

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()

Запуск leaf.py напрямую работает нормально, но запуск test_levels.py возвращает вывод ниже, где я не ожидал вывода:

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

Может кто-то указать, что я делаю неправильно?

Ответы [ 3 ]

0 голосов
/ 26 ноября 2010

В level1/level2/__init__.py, я думаю, вы хотите сделать from leaf import * (или, в Py3k, from .leaf import *).

Когда вы импортируете из level1.level2, вы действительно импортируете __init__.py файл в этом каталоге.Поскольку вы не определили Leaf там, вы не получите его, импортировав это.

0 голосов
/ 26 ноября 2010

Ожидаете ли вы импортировать все имена переменных из всех модулей в этом пакете? Это ужасная идея. Чтобы сделать то, что вы хотите, это должно быть

from level1.level2.leaf import *

или еще лучше, чтобы удалить импорт подстановочных знаков, что обычно плохо, оно должно быть

from level1.level2.leaf import Leaf
0 голосов
/ 26 ноября 2010

попробуйте добавить

from leaf import *

в файл level1 / level2 / __ init __. Py

upd: как в предыдущем комментарии, добавить точку перед именем модуля и удалить объявление "__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
...