2013-08-30 44 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。 –