从 x 导入 y 和导入 x.y 的区别

14

所以我很困惑它们之间的区别是什么...这里有一些代码来显示我的困惑:

>>> 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作为示例。 我不是在寻找特定的原因来解释collections的行为,而是要解释不同代码行在导入方面实际请求的内容。 如果您想包括有关错误的说明,请随时添加!谢谢!


OrderedDictcollections 模块中的一个类。当你看到像 x.y 这样的东西,并且从中导入了一些内容,这意味着在这种情况下,“y”实际上是一个模块。 - wheaties
所以基本上,在事情的安排中,y将是x内部的一个目录,而在模块中,y通常是一个类或函数? - Ryan Saxe
你可以在模块中嵌套其他模块。 - wheaties
我知道这个,只是我没有意识到这实际上是不同的语法。 - Ryan Saxe
嘿,别担心。这个问题其实也让我停了一下。好问题。 - wheaties
2个回答

6

OrderedDictcollections 模块中的一个类。当你看到像 x.y 这样的东西,并且从中导入了某些内容,这意味着在这种情况下 "y" 实际上是一个模块。

你应该阅读关于如何使用 import 的文档:这里。它很长并且有点复杂,但同时也很直观,因为它会查找不同的包和模块以找到应该引入的内容。具体来说,就是 import 语句 本身和 import system


5

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 不是一个子模块,而是一个对象,因此只能以第二种方式 'imported as' 导入。


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