在定义Python多层包时出现NameError

0 投票
3 回答
533 浏览
提问于 2025-04-16 07:39

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

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

撰写回答