一个Python模块和包加载混乱

时间:2013-04-24 19:59:51

标签: python python-3.x python-module

让我说我有这样的事情:

.
├── run.py
└── test
    ├── __init__.py
    ├── models
    │   ├── foo
    │   │   ├── baby.py
    │   │   └── __init__.py
    │   ├── __init__.py
    │   └── user.py
    └── start.py

run.py

from test import start

start.py

from .models import user

user.py

from . import foo

print(foo.baby.Baby)

baby.py

Baby = "I am a baby"

现在,当您运行run.py文件...

>>> python run.py
... traceback ...
AttributeError: 'module' object has no attribute 'baby'

但是,如果你像这样更改start.py

from .models.foo import baby
from .models import user

一切正常。

如果先前未加载baby中的start.py模块,则foo包对象没有对它的引用(foo.baby.Baby抛出AttributeError })。但是当我在baby中加载start.py模块时,foo包对象会自动获得对baby模块的引用。

有人可以解释一下这是如何运作的吗?

1 个答案:

答案 0 :(得分:6)

在导入之前,子模块不是包的自动属性。

test.models.foo.baby工作之前,您需要先导入foo.baby.Baby 。您可以在foo/__init__.py文件中执行此操作:

from . import baby