我一直使用from a import b
,但是最近一个工作团队决定将模块移到新的命名空间中,并发出警告通知,告诉人们将import b
替换为import a.b as b
。
我从没使用过import as
,而且我能找到的唯一文档似乎表明它不支持import a.b as b
,尽管显然它支持。
但是实际上有什么区别吗?
答案 0 :(得分:1)
据我所知,如果我做错了,请纠正我。
首先,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.options
具有此模块,也无法访问tornado
。但是作为python的全局包管理,如果您from tornado import options
,则不仅可以访问options
,还可以将其添加到命名空间tornado
中。因此,现在您还可以通过options
访问tornado.options
。
答案 1 :(得分:0)
我将仅提供部分答案,我会推测一下。
1)有时我观察到第二种方法有效,而第一种无效。在我的系统上:
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很长)。