【问题标题】:what is the difference between 'import a.b as b' and 'from a import b' in python [duplicate]python中的'import a.b as b'和'from a import b'有什么区别[重复]
【发布时间】:2018-11-29 07:01:21
【问题描述】:

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

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

但实际上有区别吗?如果有呢?

【问题讨论】:

  • 该死的,原来如此。我能找到的所有答案都给了我“import *”问题
  • 副本中没有提到一个更重要的区别。 from a import b 导入任何对象, import a.b as b 只会导入一个模块/包/命名空间。我已经为副本添加了答案。

标签: python


【解决方案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。所以现在你也可以通过tornado.options访问options

【讨论】:

    【解决方案2】:

    我将只提供部分答案,我会推测一下。

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

    【讨论】:

      猜你喜欢
      • 2018-09-21
      • 2019-06-07
      • 1970-01-01
      • 2016-08-28
      • 2019-07-02
      • 2021-10-10
      • 2016-02-16
      • 2017-09-18
      • 1970-01-01
      相关资源
      最近更新 更多