导入后属性未添加到模块 [英] Attribute not added to module after importing
问题描述
我做了以下实验:
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的属性.
pack2 is not an attribute of pack1 within pack1/pack2/mod2.py after importing pack1.pack2.mod3.
但是,当pack1/pack2/__ init__.py 不导入pack pack1.pack2.mod2时,此方法有效.
It works, however, when the pack1/pack2/__init__.py does not import pack pack1.pack2.mod2.
这是为什么?
推荐答案
当模块的导入完成时,会将模块作为其包的属性添加. (请注意,这可能会干扰循环的相对导入.)在这里,pack2
立即导入mod2
,因此(不管像mod3
这样的进一步完成的导入),在pack1
词典中它都不会出现在mod2
的执行.
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.
这篇关于导入后属性未添加到模块的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!