繁体   English   中英

定义python多级包时出现NameError

[英]NameError in defining python multi-level package

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

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

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

尝试添加

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

level1/level2/__init__.py ,我想您想from leaf import * (或在Py3k中from .leaf import * )进行。

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

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

from level1.level2.leaf import *

甚至更好的是删除通配符导入(通常是不好的),应该

from level1.level2.leaf import Leaf

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM