简体   繁体   English

导入后未将属性添加到模块

[英]Attribute not added to module after importing

I've made the following lab:我做了以下实验室:

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$

pack2 is not an attribute of pack1 within pack1/pack2/mod2.py after importing pack1.pack2.mod3.导入 pack1.pack2.mod3 后,pack2 不是 pack1/pack2/mod2.py 中的 pack1 的属性。

It works, however, when the pack1/pack2/__init__.py does not import pack pack1.pack2.mod2.然而,它的工作原理,当PACK1 / PACK2 / __ init__.py不会导入包pack1.pack2.mod2。

Why is this?为什么是这样?

A module is added as an attribute of its package when its import finishes .模块在导入完成时作为其包的属性添加。 (Note that this can interfere with circular relative imports.) Here, pack2 immediately imports mod2 , so (regardless of further completed imports like that of mod3 ) it doesn't appear in the pack1 dictionary during mod2 's execution. (请注意,这可能会干扰循环相对导入。)在这里, pack2立即导入mod2 ,因此(无论像mod3那样进一步完成导入)它不会在mod2执行期间出现在pack1字典中。

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

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