Python中“import a.b as b”和“from a import b”的区别是什么?

8

我一直使用from a import b,但最近工作中的一个团队决定将一个模块移动到一个新的命名空间,并发布了一个警告通知,告诉人们用import a.b as b替换import b.

我从未使用过import as,并且我能够找到的唯一文档似乎表明它不支持import a.b as b,尽管很明显它支持。

但实际上有什么区别,如果有的话是什么?


1
这里有关于使用"from...import"和"import...as"导入模块的讨论。 - Onk_r
该死,原来如此。我能找到的所有答案都是关于“import *”的问题。 - Tom Tanner
有一个更重要的区别,这个重复没有提到。从a导入b会导入任何对象,而import a.b as b只会导入一个模块/包/命名空间。我已经在重复问题中添加了一个答案。 - cdarke
2个回答

2
据我所知,如果我有错请指正。
首先,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了。

1
我将提供部分答案,并进行一些猜测。
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 中的一个文件非常长)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接