2013-08-21 97 views
2

請注意,這樣做不是一個好主意。它很混亂,容易出錯,並且通常完全沒有必要。python import忽略本地包

但對於參數的緣故,說你有一個本地包具有相同的名稱作爲全球包裝:

module/ 
    __init__.py 
    os.py 
    thisfile.py 

thisfile.py,你可以明確指定你想導入地方版本的使用下面的一個os.py

from . import os 
from .os import foo 

但事實上,與Python 2.x中,本地封裝分辨率爲默認值。只需一個簡單的import os將加載本地os.py而不是系統包。

那麼我怎麼在thisfile.py裏導入系統級的os包而不是本地定義的替代方案呢?

+2

雖然有方法可以解決這個問題,但正如mata的答案和[PEP 328](http://www.python.org/dev/peps/pep-0328/)所解釋的那樣,給出一個真的不是個好主意您的模塊與stdlib模塊名稱相同。即使你可以避免混淆翻譯,你仍然會混淆你的代碼中的每一個讀者。 – abarnert

+0

@abarnert同意。現在看到問題的前8個單詞。 – tylerl

+0

我只是指出_why_這不是一個好主意,因爲我認爲這個評論對未來的讀者來說是有用的,他們只是「忽略這是否明智......」,並且認爲他們應該實際上這樣做而不是簡單。 – abarnert

回答

6

此行爲是python2特有的。在python3中,默認情況下導入是絕對的,可以完全解決這類問題。

在的python2.5 + *,您可以使用未來的進口解決這個問題:

from __future__ import absolute_import 

在此之後,所有的進口將是絕對的,導入具有相同的名稱作爲一個模塊頂級模塊使用顯式相對導入語法。

有關更多背景信息,請參見PEP 328


*編輯:在早期的Python版本,唯一的辦法是修改sys.path的方式,頂層模塊被首次發現 - 這實際上是一個可怕的解決方案。