在定义Python多层包时出现NameError
我正在尝试创建一个简单的多层包:
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
在 level1/level2/__init__.py
文件中,我觉得你想要写 from leaf import *
(或者在 Python 3 中写 from .leaf import *
)。
当你从 level1.level2
导入东西时,其实是导入了那个目录下的 __init__.py
文件。因为你在里面没有定义 Leaf
,所以通过这种方式导入是拿不到它的。
0
你是不是想把那个包里所有模块的变量名都导入?这真是个糟糕的主意。要实现你想要的效果,应该这样做:
from level1.level2.leaf import *
或者更好的办法是去掉这种通配符导入,因为通常这样做是不好的,应该这样:
from level1.level2.leaf import Leaf
0
试着添加
from leaf import *
在文件 level1/level2/__init__.py 中
更新:就像之前的评论说的,模块名称前面加个点,并且去掉 "__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