有人可以在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')?
答案 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')?
不,这不是真的(我希望你理解为什么)。