0

我正在尝试创建一个简单的多级包:

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

叶.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

有人可以指出我做错了什么吗?

4

3 回答 3

0

尝试添加

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
于 2010-11-26T16:34:24.937 回答
0

level1/level2/__init__.py中,我认为你想做from leaf import *(或者,在 Py3k 中from .leaf import *)。

当您从 导入时level1.level2,您实际上是__init__.py在该目录中导入文件。由于您尚未在其中定义Leaf,因此您无法通过导入它来获得它。

于 2010-11-26T16:34:41.667 回答
0

您是否希望从该包中的所有模块中导入所有变量名?这是一个可怕的想法。做你想做的,它应该是

from level1.level2.leaf import *

甚至更好的是删除通配符导入,这通常很糟糕,应该是

from level1.level2.leaf import Leaf
于 2010-11-26T17:22:48.950 回答