我一直使用from a import b
,但最近工作中的一个团队决定将一个模块移动到一个新的命名空间,并发布了一个警告通知,告诉人们用import a.b as b
替换import b
.
我从未使用过import as
,并且我能够找到的唯一文档似乎表明它不支持import a.b as b
,尽管很明显它支持。
但实际上有什么区别,如果有的话是什么?
我一直使用from a import b
,但最近工作中的一个团队决定将一个模块移动到一个新的命名空间,并发布了一个警告通知,告诉人们用import a.b as b
替换import b
.
我从未使用过import as
,并且我能够找到的唯一文档似乎表明它不支持import a.b as b
,尽管很明显它支持。
但实际上有什么区别,如果有的话是什么?
import a.b
必须导入一个模块(一个文件)或者一个包(一个包含 __init__.py
文件的目录)。import tornado.web as web
,但是你不能使用 import flask.Flask as Flask
,因为 Flask
是在包 flask
中的一个对象。import a.b
还会导入命名空间 a
,而 from a import b
不会。你可以通过 globals()
来检查它。import tornado.web as web
tornado
,但是即使tornado
有这个模块,你也不能访问tornado.options
。但是由于Python的全局包管理方式,如果你使用from tornado import options
,不仅可以访问options
,而且还可以将其添加到tornado
的命名空间中。所以现在你也可以通过tornado.options
访问options
了。Python 3.6.3 (default, Oct 3 2017, 21:45:48)
[GCC 7.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from tensorflow import keras # <- this works
>>>
>>> import tensorflow.keras as K # <- this fails
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'tensorflow.keras'
>>>
2) 我通常看不出这两种导入方法之间的区别。我还没有调查为什么在 TensorFlow 中有差异。可能与各个 TensorFlow 子文件夹 init.py 文件导入到顶层的名称有关(在大多数情况下,它们完全为空,但在 ../dist_packages/tensorflow/python 中的一个文件非常长)。