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

标签 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 时它起作用。

这是为什么?

最佳答案

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

关于python - 导入后未将属性添加到模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54430706/

相关文章:

Python在一个txt文件中合并行

php - 需要什么以及如何将 TTL 指纹模块连接到 Raspberry pi 3

python - 解码使用 urllib 下载的 html 文件

python-3.x - Visual Studio Code : highlighted imports in python

Python 找不到模块 h2o

python - Pandas:从列表中选择包含任何子字符串的行

python - 时间字符串与当前时间(不含年份)之间的差异

尝试在远程桌面上运行应用程序时出现 Python 错误

python - reshape (60000, 28, 28, 1) 是什么意思?

python - Pytest junit-xml 报告没有 "file"字段