python中``将a.b作为b导入''和``从导入b''有什么区别

时间:2018-06-20 08:02:52

标签: python

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

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

但是实际上有什么区别吗?

2 个答案:

答案 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很长)。