为什么在Python中需要指定特定类进行导入?
我刚刚把我的Python升级到了2.7.1(在Mac上),这样我就可以使用OrderedDicts了。
然后我尝试运行下面的脚本:
import collections
test = OrderedDict()
结果我得到了:
NameError: name 'OrderedDict' is not defined
我通过以下方式解决了这个问题:
from collections import OrderedDict
...但是我想知道为什么我需要这样做?
为什么简单的import collections
对我没有用呢?
4 个回答
2
我觉得事情是这样的:
当你写 import collections
的时候,其实是在当前的命名空间里,把“collections”这个模块赋值给了一个叫 collections
的变量。
这时,你可以通过 collections.OrderedDict
来访问 collections 模块里的 OrderedDict
类。
但是 import collections
并不会 在本地命名空间里自动创建其他变量。也就是说,它不会把 collections 模块里的所有东西都自动赋值给变量(不过,正如其他回答中提到的,你可以手动这样做)。
至于 为什么 不这样做,我觉得这和 Python 之禅 中的第二条有关:“显式优于隐式。”
4
你可以用 import * from fooModule
这种方式来导入模块里的所有东西,但这样做不好,会让人很不高兴。
想知道为什么这样做不好,可以输入 import this
来看看简单的解释。
30
import collections
这段代码把“collections”这个模块引入到当前的命名空间里,这样你就可以像这样使用它:
import collections
orderedDict = collections.OrderedDict()
不过,如果你只需要某个特定的功能(而不是整个库),你可以这样做:
from collections import OrderedDict
这段代码只把指定的类引入到当前的命名空间里。