Python包和导入 - 需要澄清

时间:2012-04-26 13:21:16

标签: python python-3.x package

Python的导入功能有时让我感到困惑。这是一个例子:

我的项目具有以下包结构:

Project/
    src/
        example/
            __init__.py
            an_example.py
        top/
            __init__.py
            lin/
                __init__.py
                factory.py

an_example.py,我想写

from top import lin
if __name__ == '__main__':
    a = lin.factory.AClass()

然而,这失败了:

    a = lin.factory.AClass()
AttributeError: 'module' object has no attribute 'factory'

an_example.py在这样写的时候起作用:

from top.lin import factory
if __name__ == '__main__':
    a = factory.AClass()

你能解释为什么写第一个版本的import语句是错误的吗?我更喜欢完全限定的名称,例如lin.factory.AClassfactory.AClass

1 个答案:

答案 0 :(得分:4)

这是因为,除非您在lin中告诉factory导入__init__.py,否则factory不在lin命名空间中。

例如:

假定您现有的项目结构,其中an_example.py包含:

from top import lin

lin.factory.AClass()

如果top/lin/__init__.py为空,我们会获得ImportError: No module named factory

top/lin/__init__.py包含import top.lin.factory,我们不会收到任何错误。

当您要求使用factory.AClass()时,它会起作用,因为它是在那里定义的。同样,如果您想在lin中使用它,则需要在{{1}}中定义工厂。