【问题标题】:difference between from x import y and import x.y从 x 导入 y 和导入 x.y 之间的区别
【发布时间】:2013-10-30 04:59:06
【问题描述】:

所以我很困惑有什么区别......这里有一些代码可以显示我的困惑:

>>> import collections.OrderedDict as od
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named OrderedDict
>>> from collections import OrderedDict as od
>>> od
<class 'collections.OrderedDict'>

解释:

import collections.OrderedDict 没有找到模块,但from collections import OrderedDict 找到了?! 这两种说法有什么区别?

类被读取为collections.OrderedDict,所以我不明白为什么第一次尝试找不到模块

注意:

我只是以collections 为例。我并不是在寻找具体为什么我的示例以它对集合的方式行事,而是在解释不同代码行在导入时实际要求的内容。如果您想对错误进行解释,请随意!谢谢!

【问题讨论】:

  • OrderedDictcollections 模块中的一个类。当你看到像 x.y 这样的东西并且正在从中导入一些东西时,这意味着在这种情况下,“y”实际上是一个模块。
  • 哦,所以基本上 y 将是 x 在事物方案中的目录,否则 y 是模块内的类或函数?
  • 你可以在模块中嵌套模块,是的。
  • 我知道,只是没有意识到这实际上是不同的语法
  • 嘿,不用担心。它实际上也让我停下来。好问题。

标签: python import


【解决方案1】:

OrderedDictcollections 模块中的一个类。当您看到 x.y 之类的东西并且正在从中导入某些东西时,这意味着在这种情况下,“y”实际上是一个模块。

您应该阅读有关import 工作原理的文档:here。它很长而且很复杂,但同时也相当直截了当,它研究了不同的包和模块以找到应该发挥作用的东西。具体来说,导入statement 本身和import system

【讨论】:

    【解决方案2】:

    PEP 221 谈论import as

    import foo.bar
    

    用于导入模块foo子模块 bar。这可以“导入为”

    import foo.bar as fb
    

    一个对象被导入

    from foo import baz
    

    这也可以“导入为”

    from foo import baz as fb
    

    collections.OrderedDict 不是子模块而是对象,所以只能通过第二种方式“导入为”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-29
      • 2018-04-06
      • 1970-01-01
      • 2019-04-18
      • 2018-03-19
      • 2018-07-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多