4

有人可以解释一下 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 不是在 from...import 时执行的,因此它应该被“称为”模块吗?我是否正确地说,将 os 排除在已知名称之外只是一种约定,旨在防止名称空间的“污染”带有未直接导入的符号(如“import os”)?

4

1 回答 1

3

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

这一行:

from path import *

方法:

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

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

type(os.path)

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

我想知道是什么机制允许诸如“from os import path”之类的语句起作用,而 os 仍然是未定义的?

导入会导致搜索模块中定义的路径PYTHONPATH;有关导入如何工作的更多说明,请参阅effbot 上的这篇文章。

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

os 不是在 from...import 时执行的,因此它应该被“称为”模块吗?

不,当你做的from x import y只是y导入,而不是x.

我是否正确地说,将 os 排除在已知名称之外只是一种约定,旨在防止名称空间的“污染”带有未直接导入的符号(如“import os”)?

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

于 2013-08-30T20:01:29.970 回答