导入后属性未添加到模块

时间:2019-01-29 22:40:51

标签: python python-3.x python-2.7 import

我做了以下实验:

vagrant@ubuntu-xenial:~/test$ tree
.
├── pack1
│   ├── __init__.py
│   ├── mod1.py
│   └── pack2
│       ├── __init__.py
│       ├── mod2.py
│       └── mod3.py
└── test.py

2 directories, 6 files
vagrant@ubuntu-xenial:~/test$ tail -n +1 *.py */*.py */*/*.py
==> test.py <==
#!/usr/bin/python
import pack1.pack2.mod2
print(__file__)
try:
    print(pack1.__dict__['pack2'])
except Exception as error:
    print("MISSING PACK2")

==> pack1/__init__.py <==

==> pack1/mod1.py <==

==> pack1/pack2/__init__.py <==
import pack1.pack2.mod2

==> pack1/pack2/mod2.py <==
import pack1.pack2.mod3
print(__file__)
try:
    print(pack1.__dict__['pack2'])
except Exception as error:
    print("MISSING PACK2")

==> pack1/pack2/mod3.py <==
vagrant@ubuntu-xenial:~/test$ ./test.py
/home/vagrant/test/pack1/pack2/mod2.py
MISSING PACK2
./test.py
<module 'pack1.pack2' from '/home/vagrant/test/pack1/pack2/__init__.py'>
vagrant@ubuntu-xenial:~/test$

在导入pack1.pack2.mod3之后,pack2不是pack1 / pack2 / mod2.py中pack1的属性。

但是,当pack1 / pack2 / __ init__.py 导入pack pack1.pack2.mod2时,此方法有效。

这是为什么?

1 个答案:

答案 0 :(得分:1)

模块的导入完成时,会将模块添加为其包的属性。 (请注意,这可能会干扰循环的相对导入。)在这里,pack2立即导入mod2,因此(无论mod3之类的进一步完成的导入),它都不会出现在pack1执行期间的mod2字典。