2013-08-30 136 views
4

可能有人请阐明此行为的一些光:Python的进口细微差别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 

。负面的问题,我不知道什么是允许的语句,如机制“从操作系统导入路径'工作,而仍然是不确定的? os在执行from ... import时不会被执行,并且它应该被“称为”模块?我是否正确地说,保持已知名称不变是一种惯例,旨在防止名称空间的“污染”与未直接导入的符号(如'import os'中所示)?

回答

3

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

这条线:

from path import * 

方式:

“试图找到一个叫是在 PYTHONPATH任何目录path模块,并尝试从它的所有名称导入到当前 名称空间“。

由于在当前工作目录中没有这样的模块,更重要的是不在PYTHONPATH的任何目录中,所以导入失败。请注意,搜索不会搜索PYTHONPATH中任何目录的子目录。因为在当前的命名空间是没有名字os(因为它不是进口)

type(os.path) 

此行失败。

我不知道什么是允许的语句,如“从 OS导入路径”的工作机制,同时又不失OS是不确定的?

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

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

是不是在执行从...导入时,这样它应该 被称为模块?

没有,当你做from x import yy是进口的,不x

我说得对不对地说,保持OS出已知的名字是一个简单的 公约,旨在防止命名空间的“polution”与没有被直接导入(如“进口OS 符号“)?

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

+0

谢谢。我似乎在做出一些错误的假设,尤其是那些已经导入的名称将被涉及它的后续导入所“识别”,而不是简单地认为任何导入实际上只处理文件系统和文件系统。标准的Python文档(我熟悉的)应该已经清除了这种“进口链”,但由于某种原因,我的思想坚持要建立这种关系。 –

+0

为了彻底,当'from x import y'运行时,x _ will_将被执行(尽管它不会被导入!)。参考:http://stackoverflow.com/questions/10993156/python-importing-module。 –