Python导入细微差别

时间:2013-08-30 19:47:43

标签: python import

有人可以在Python解释器中阐明这种行为:

from os import path    # success
type(path)             # <class 'module'>
from path import *     # complains that no module called 'path' exists 

type(os.path)          # complains that the name 'os' is not defined, yet:
from os.path import *  # works just fine

作为一个侧面问题,我想知道什么是允许诸如'from os import path'之类的语句才能工作的机制,而os还是未定义的?是不是在执行时从...导入执行,这样它应该“知道”作为一个模块?我是否正确地说,将os从已知名称中删除仅仅是一种约定,旨在防止命名空间的“污染”与尚未直接导入的符号(如'import os')?

1 个答案:

答案 0 :(得分:3)

这不是特定于Python 3,你在Python 2中遇到了同样的问题。导入名称会将其添加到名称空间中,仅此而已。

这一行:

from path import *

意思是:

  

“尝试在任何目录中找到名为path的模块   PYTHONPATH,并尝试将其中的所有名称导入当前名称   命名空间“。

由于当前工作目录中没有此类模块,更重要的是不在PYTHONPATH中的任何目录中,导入失败。请注意,搜索不会搜索PYTHONPATH中任何目录的子目录

type(os.path)

此行失败,因为当前命名空间中没有名称os(因为它未导入)。

  

我想知道什么是允许声明的机制,例如'from   os导入路径'工作,但仍未定义操作系统?

导入导致搜索PYTHONPATH中定义的路径以搜索模块;有关导入如何工作的更多说明,请参阅this article on effbot

“未定义”仅表示名称空间中不存在该名称。

  

从...导入时不执行操作系统,并且应该执行此操作   被“称为”模块?

不,当您执行from x import y时,仅导入y,而不是x

  

我是否正确地说,将os从已知名称中删除仅仅是一个   惯例,旨在防止命名空间的“污染”   尚未直接导入的符号(如'import os')?

不,这不是真的(我希望你理解为什么)。